【问题标题】:C# task "finishes" at Task.Delay? (WinRT)C# 任务在 Task.Delay 处“完成”? (WinRT)
【发布时间】:2013-10-10 18:51:14
【问题描述】:

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

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

话虽如此,鉴于它以同步方式处理,但我无法完全公开代码,我真的需要了解整个任务完成心态。

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

【问题讨论】:

  • mTimeout的值是多少?
  • await Task.Delay(500); 替换为Task.Delay(500).Wait(); 会得到什么
  • mTimeout 约为 10.000。
  • Task.Delay(x).Wait();似乎解决了这个问题。我仍然想知道 Task.Delay 将任务的“IsCompleted”设置为 true 背后的逻辑是什么?

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


【解决方案1】:

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

总之,StartNew 不理解 async 方法。它返回的Task 仅代表该方法的第一个同步部分。要使用StartNew,您要么必须调用Unwrap,要么调用双重await。最好使用Task.Run,它确实理解async 方法。

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

【讨论】:

  • 这澄清了!谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多