29

4つのタスクを生成するボタンがあります。同じボタンがキャンセルボタンに変わり、これをクリックすると4つのタスクすべてがキャンセルされます。4つのタスクすべてに同じキャンセルトークンを渡して、IsCancelRequestedについて同じトークンをポーリングさせる必要がありますか?createlinkedtokensourceのmsdnドキュメントを読んだ後、混乱しています。これは通常どのように行われますか?ありがとうございました

更新:Task.WaitAll()は、すべてのタスクの実行が完了するまで待機します。同様に、共有キャンセルトークンソースがキャンセルに設定された後、すべてのタスクがいつキャンセルされたかを知る方法。

4

3 に答える 3

31

ええ、シングルの使用についてあなたが言ったことCancellationTokenは正しいです。シングルを作成して、それをすべてのタスクにCancellationTokenSource使用できます。CancellationTokenタスクはトークンを定期的にチェックしてキャンセルする必要があります。

例えば:

const int NUM_TASKS = 4;

CancellationTokenSource cts = new CancellationTokenSource();
CancellationToken ct = cts.Token;

Task[] tasks = new Task[NUM_TASKS];
for (int i = 0; i < NUM_TASKS; i++)
{
    tasks[i] = Task.Factory.StartNew(() =>
    {
        while (true)
        {
            Thread.Sleep(1000);
            if (ct.IsCancellationRequested)
                break;
        }
    }, ct);
}

Task.WaitAll(tasks);

ボタンを呼び出しcts.Cancel();てタスクをキャンセルできます。

質問の更新のための更新:

あなたが求めることをするためのいくつかの方法があります。1つの方法は、ct.IsCancellationRequestedスローせずにキャンセルを確認してから、タスクを完了できるようにすることです。その後Task.WaitAll(tasks)、すべてのタスクがキャンセルされたときに完了します。

その変更を反映するようにコードを更新しました。

于 2011-09-16T22:03:10.863 に答える
2

はい、それがあなたの意図であるならば、あなたは同じトークンを渡し、これを使ってすべてのタスクを一度にキャンセルするべ​​きです。

于 2011-09-16T22:01:38.493 に答える
-2

BackroundWorkerクラスを使用し、プロパティWorkerSupportsCancellationを設定し、 RunWorkerAsync()を呼び出してタスクを開始し、 CancelAsync( を使用してタスクを停止します。

コードをUIと同期する必要はありません。

于 2011-09-16T22:04:39.047 に答える