0

我在任务和 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;
    }
}

所以这里我的问题是,当我运行这段精彩的代码时,我会在“......做更多的事情......”之前进入开关盒。然后任务继续运行直到完成。这不是所需的功能,因为我真的希望完成任务。

话虽这么说,考虑到它以同步方式处理,但我不能完全公开代码,我真的需要了解整个任务完成的心态,在这个特定的上下文中将它放在它自己的任务中有点多余。

发生了什么事,我如何才能真正检查任务是否真的结束了?

4

1 回答 1

4

不要使用Task.Factory.StartNew. 改为使用Task.RunStephen Toub都有博客文章详细描述了这一点。

总而言之,StartNew不懂async方法。它返回的Task仅代表方法的第一个同步部分。要使用StartNew,您必须调用Unwrap或执行 double await。使用它要好得多Task.Run,它确实理解async方法。

此外,您不想阻止async任务(即Waitin Synchronize)。相反,你应该await他们。如果您阻止它们,您很容易遇到我在博客中描述的死锁情况。

于 2013-10-10T19:15:31.957 回答