1

Тест выглядит следующим образом:Почему этот тест продолжает терпеть неудачу?

[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); 
} 

Если я обеспечить значение «0», чтобы CancelAfter, то тест завершается успешно. Почему этот тест продолжает терпеть неудачу с другими значениями.

Это использует структуру MS Test в Visual Studio Express,

+1

Поскольку продолжение будет выполняться, даже если токен, переданный в Run, уже отменен, но родительская задача не будет. Он не подходит для других значений, потому что аннулирование является совместным. Запуск проверяет маркер перед запуском задачи, а не посередине. –

+0

Отмена маркера ** не прерывает задачу. Линия 'Thread.Sleep (200)', кажется, подразумевает, что вы ожидаете, что это будет прервано (после, скажем, 10 мс)? – Groo

ответ

2

Отмена маркера не прервать выполнения этой задачи. Он просто устанавливает флаг, который вы должны проверить внутри задачи (CancellationToken.IsCancellationRequested). Однако, если токен отменяется до начала Task, Task не будет запускаться и будет пропущен до продолжения.

Тот факт, что вы ожидаете breached быть false после испытаний означает, что вы ожидали, что задача будет прервана по истечении срока, указанного в CancelAfter.

Другими словами, ваш Thread.Sleep(200) не имеет цели, хотя маркер будет вероятно будет отменен в ~ 10мс после запуска задачи (не следует ожидать очень точного времени).

+1

Также рекомендуется разработать долгосрочные операции с поддержкой запроса отмены мониторинга, если это возможно. –

Смежные вопросы