35

タスクがあり、実行に 1 秒もかからないと予想していますが、数秒以上かかる場合は、タスクをキャンセルしたいと考えています。

例えば:

Task t = new Task(() =>
        {
            while (true)
            {
                Thread.Sleep(500);
            }
        });
t.Start();
t.Wait(3000);

3000 ミリ秒後に待機が期限切れになることに注意してください。タイムアウトの期限が切れたときにタスクがキャンセルされたか、それともタスクがまだ実行中か?

4

5 に答える 5

54

Task.Wait()タスクの完了を指定された期間まで待機し、タスクが指定された時間内 (またはそれ以前) に完了したかどうかを返します。タスク自体は変更されず、待機に依存しません。

素敵なシリーズを読む: Parallelism in .NET、 Parallelism in .NET – Part 10、 Reed Copsey によるPLINQ の取り消しと Parallel クラス

そして: .NET 4 Cancellation Framework / Parallel Programming: Task Cancellation

次のコードを確認してください。

var cts = new CancellationTokenSource();

var newTask = Task.Factory.StartNew(state =>
                           {
                              var token = (CancellationToken)state;
                              while (!token.IsCancellationRequested)
                              {
                              }
                              token.ThrowIfCancellationRequested();
                           }, cts.Token, cts.Token);


if (!newTask.Wait(3000, cts.Token)) cts.Cancel();
于 2010-10-27T18:07:15.077 に答える
16

をキャンセルしたい場合は、タスクの作成時Taskに a を渡す必要があります。これにより、外部からのCancellationTokenキャンセルが可能になります。Task必要に応じて、キャンセルをタイマーに関連付けることができます。

キャンセル トークンを使用してタスクを作成するには、次の例を参照してください。

var tokenSource = new CancellationTokenSource();
var token = tokenSource.Token;

var t = Task.Factory.StartNew(() => {
    // do some work
    if (token.IsCancellationRequested) {
        // Clean up as needed here ....
    }
    token.ThrowIfCancellationRequested();
}, token);

Taskで通話をキャンセルするCancel()には、tokenSource.

于 2010-10-27T18:20:54.803 に答える
7

明示的に停止するように指示するか、ループが終了するまで、タスクは引き続き実行されます (これは決して起こりません)。

Wait の戻り値を確認して、これを確認できます。

( http://msdn.microsoft.com/en-us/library/dd235606.aspxから) 戻り値

型: System.Boolean Task が割り当てられた時間内に実行を完了した場合は true。それ以外の場合は false。

于 2010-10-27T18:03:35.157 に答える
6

タイムアウトの期限が切れたときにタスクがキャンセルされたか、それともタスクがまだ実行中か?

いいえ、はい。

に渡されるタイムアウトは、タスクではなくTask.Wait用です。Wait

于 2010-10-27T18:04:09.977 に答える