1

試験である:私はCancelAfterに「0」の値を提供する場合このテストはなぜ失敗しますか?次のように

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

、次にテストケースは成功します。このテストは他の値で失敗し続けるのはなぜですか?

これはトークンタスクを中止しないキャンセルのVisual Studio Expressの

+1

実行に渡されたトークンはすでにキャンセルされていても親タスクはキャンセルされていても継続が実行されるためです。取り消しは協調的であるため、他の値では失敗します。実行は、タスクを開始する前にトークンのみをチェックし、途中ではチェックしません。 –

+0

トークンをキャンセルしても、タスクは中止されません**。 'Thread.Sleep(200)'行は、これが(例えば10ms後に)中止されることを期待していると思われます。 – Groo

答えて

2

内MSのテストフレームワークを使用しています。これは、タスク内で確認する必要があるフラグを設定するだけです(CancellationToken.IsCancellationRequested)。ただし、Taskが開始される前にトークンが取り消された場合、Taskは実行されず、継続にスキップされます。

あなたはbreachedは試験後falseことを期待しているという事実は、あなたは、タスクがCancelAfterで指定された期間の後に中止されると予想することを意味します。言い換えれば

、あなたの Thread.Sleep(200)トークンが おそらくは、タスクの開始後〜10ミリ秒で解除されますが、(あなたは非常に正確なタイミングを期待すべきではありません)、目的を持っていません。

+1

可能であれば、キャンセル要求の監視をサポートして、長時間実行する操作を設計することもお勧めします。 –

関連する問題