【发布时间】:2014-07-19 03:31:05
【问题描述】:
该问题描述了在此处找到的相同问题 - MSDN Developer Forum。该问题没有可接受的答案,给出的任何答案都不能应用于我的案例(因此是一个不同的问题)。
问题也源自我asked previously,但由于性质不同和更具体的问题,我要问一个新问题。
完整代码可以在这里找到:http://pastebin.com/uhBGWC5e
* 唯一改变的是任务完成检查 (while -> Task.WhenAll)。
当等待任务内部的异步操作时,任务状态会更改为RanToCompletion,即使任务仍在运行。
现在,让我们看看设置:
// Start async.
Task t1 = Task.Factory.StartNew(Accept, s1);
Task t2 = Task.Factory.StartNew(Accept, s1);
Task.WhenAll(t1, t2).Wait();
Accept 方法:
public static async void Accept(object state)
{
TcpListenerEx server = (TcpListenerEx) state;
IPEndPoint endPoint = server.LocalEndpoint as IPEndPoint;
Log("Accepting clients on {0}", endPoint);
while (true)
{
var client = server.AcceptTcpClientAsync();
if (client == null)
{
Log("Null error on accept");
break;
}
TcpClient connected = (TcpClient) client;
servers[server].Add(connected);
bool stop = await Task<Task<bool>>.Factory.StartNew(Listen, connected).Unwrap();
if (stop == true)
{
break;
}
}
// Stop the server.
server.Stop();
Log("Stoppped {0}", endPoint);
}
由于 TaskStatus 更改为 RanToCompletion,Task.WhenAll().Wait() 调用本身很快就完成了,导致程序继续执行,最终 - 终止。
但是,理论上,Accept 任务永远不会停止,它一直在监听连接,直到明确停止。
这里是什么问题导致任务被过早标记为RanToCompletion?
【问题讨论】:
-
是否与您使用
Task.Factory.StartNew调用异步方法而不是让该方法返回Task有关?
标签: c# .net asynchronous async-await .net-4.5