为什么在取消任务之前不等待任务?

时间:2015-09-15 13:38:15

标签: c# multithreading task-parallel-library

我需要编写一个服务,其中包含一些复杂的行为,比如simultanious任务,我正面临一个问题。

我在xUnit中编写了一个示例来向您展示问题。

1想要在后台执行任务,最终启动一些子任务。 在某个时刻,任务需要被取消。

因此,我有以下内容:

[Fact]
public void ShouldWaitUnitTaskCompleted()
{
    Task.Factory.StartNew(() =>
    {
        while (!cancellationTokenSource.IsCancellationRequested)
        {
            Task.Delay(10000).Wait();
            TaskIsCompleted = true;
        }
    }, cancellationTokenSource.Token);

    Thread.Sleep(3000);

    cancellationTokenSource.Cancel();

    Assert.True(TaskIsCompleted);
}

}

然而,xUnit在3秒后完成(我的线程休眠)。 在我的任务中,我有一个循环说,只要它不是取消请求延迟,如果持续10秒。

所以我期望的行为是:

  • 启动该应用程序。
  • 启动任务(因为它没有取消请求,将启动10秒的延迟)。
  • 等待3秒钟然后取消令牌。
  • 等待10秒延迟的任务完成,然后退出。

为什么我的代码不等待10秒帧通过?

2 个答案:

答案 0 :(得分:4)

您不是await您创建的Task。因此,代码的执行只会继续到Thread.Sleep(3000)

答案 1 :(得分:2)

Cancel表示已请求取消。

等待所有任务完成,然后才允许取消代码继续执行有用的操作 - 如果 想等待这些任务响应,已经有机制让你分开做到这一点。所以Cancel只做一份工作,做得很好。