6

一つの方法は次のとおりです。キャンセルトークンを呼び出し元メソッドVSタスクコンストラクタに渡しますか?キャンセルトークンを渡す

/* Cancellation token passed as method parameter */ 
Task task = Task.Run(() => { LongTask(1000000, cancellationToken.Token); }); 

もう一つの方法は次のとおりです。

/* Cancellation Token passed as task constructor */ 
Task task = Task.Run(() => { LongTask(1000000); }, cancellationToken.Token); 

違いは何ですか?

答えて

6

最初にトークンをメソッドに渡します。トークンは、メソッドでトークンを渡します。 2番目のトークンは、そのトークンにタスクを関連付けるTask.Runにトークンを渡します。

Task.Runは、実行がまだ開始されていない(これはあまり役に立ちません)場合にのみタスクをキャンセルすることができ、あなたのメソッドは時々トークンをチェックし、キャンセルがあった場合にスローできます。キャンセルされているのではなくフォールトされたものとしてマークされます。あなたが実際に両方を行う必要があり、完全なソリューションのために

var task = Task.Run(() => LongTask(1000000, cancellationToken), cancellationToken); 

タスクはトークンに関連付けられている、あなたがキャンセルのためのトークンを確認することができますこの方法。

関連する問題