我遇到了任务和Task.Factory的这种特殊情况。所以这是我的代码。
public Task CreateAndStartSyncTask()
{
return Task.Factory.StartNew(async () =>
{
... do stuff ...
await Task.Delay(500);
... do more stuff ...
}
}
public void Synchronize()
{
var syncTask = CreateAndStartSyncTask();
syncTask.Wait(mTimeout);
switch(syncTask.Status) {
case TaskStatus.RanToCompletion:
// VICTORY!
break;
default:
throw syncTask.Exception;
}
}
所以我的问题是,当我运行这段辉煌的代码时,我会在“更多东西......”之前找到转换案例。然后任务继续运行直到完成。这不是理想的功能,因为我真的更喜欢完成任务。
话虽如此,考虑到它以同步方式处理但我无法完全披露代码并且我真的需要理解整个任务,在这个特定的上下文中将它放在它自己的任务中有点多余完成心态。
什么事,我怎样才能真正检查任务是否真的结束了?
答案 0 :(得分:4)
请勿使用Task.Factory.StartNew
。请改用Task.Run
。 Stephen Toub和I都有博文,详细描述了这一点。
总之,StartNew
无法理解async
方法。它返回的Task
仅代表方法的第一个同步部分。要使用StartNew
,您必须致电Unwrap
或进行双倍await
。使用Task.Run
会更好,它可以理解async
方法。
此外,您不希望阻止async
个任务(即Wait
中的Synchronize
)。相反,你应该await
他们。如果你阻止它们,你很容易遇到我在我博客上描述的deadlock situation。