为什么这个测试总是失败?

Why does this test keeps failing?

测试如下:

[TestMethod()]
public void IncrementTestNegative() {

    CancellationTokenSource s = new CancellationTokenSource();
    s.CancelAfter(10);

    ManualResetEventSlim evt = new ManualResetEventSlim();

    bool breached = false;
    Task.Run(() => {
        Thread.Sleep(200);
        breached = true;
    }, s.Token).ContinueWith((t) => {
        evt.Set();
    });


    evt.Wait();
    Assert.IsFalse(breached);
}

如果我为 CancelAfter 提供值“0”,则测试用例成功。为什么此测试在使用其他值时总是失败。

这是在 Visual Studio Express

中使用 MS 测试框架

取消令牌不会中止任务。它仅设置您必须在任务中检查的标志 (CancellationToken.IsCancellationRequested)。但是,如果令牌在 Task 甚至开始之前被取消,则 Task 将不会 运行 并将跳到继续。

您希望 breached 在测试后成为 false 这一事实意味着您希望任务在 CancelAfter 指定的时间段后中止。

换句话说,您的 Thread.Sleep(200) 没有任何用途,尽管令牌 可能 在任务开始后约 10 毫秒被取消(您不应该期望非常精确的时间)。