C#任务在Task.Delay“完成”? (WinRT的)

时间:2013-10-10 18:51:14

标签: c# windows-runtime task delay async-await

我遇到了任务和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;
    }
}

所以我的问题是,当我运行这段辉煌的代码时,我会在“更多东西......”之前找到转换案例。然后任务继续运行直到完成。这不是理想的功能,因为我真的更喜欢完成任务。

话虽如此,考虑到它以同步方式处理但我无法完全披露代码并且我真的需要理解整个任务,在这个特定的上下文中将它放在它自己的任务中有点多余完成心态。

什么事,我怎样才能真正检查任务是否真的结束了?

1 个答案:

答案 0 :(得分:4)

请勿使用Task.Factory.StartNew。请改用Task.RunStephen ToubI都有博文,详细描述了这一点。

总之,StartNew无法理解async方法。它返回的Task仅代表方法的第一个同步部分。要使用StartNew,您必须致电Unwrap或进行双倍await。使用Task.Run会更好,它可以理解async方法。

此外,您不希望阻止async个任务(即Wait中的Synchronize)。相反,你应该await他们。如果你阻止它们,你很容易遇到我在我博客上描述的deadlock situation