2012-09-14 16 views
5

MyクラスにはTaskCompletionSource<int>を使用してTask<int>オブジェクトを生成するメソッドがあります。次に、いくつかの非同期操作を実行し、結果を設定します。私は、タスクのContinueWith方法かどうかを信頼できるかどうかを知っておく必要があります。タスクの継続をキャンセルするにはどうすればいいですか?

public Task<int> CalculateAsync() 
{ 
    var source = new TaskCompletionSource(); 
    DoSomeAsyncStuffAndSetResultOf(source); 

    source.Task.ContinueWith(t => Console.WriteLine("Is this reliable?")); 
    return source.Task; 
} 

CalculateAsyncメソッドの呼び出し側が作成したタスクに何かをして実行しているから、その継続を阻止することはできますか?

答えて

4

CancellationTokenContinueWithのさまざまなオーバーロードに渡すことができます。これは、継続をキャンセルする最も慣用的な方法であるIMOです。

親のに続行をキャンセルすることはできません。とにかく私はまったく希望しません...

編集:さて、あなたがしようとしているように聞こえるそれを起こさせる。いいえ、心配する必要はありません。呼び出し元が何らかの理由でタスクを完了せずに永久に実行させることができない限り、キャンセルまたはフォールトが発生すると、継続が実行されます。

+0

ああ、私は見ています。いいえ、継続は常に実行されます(呼び出し元はタスクを永遠に実行し、完了することはないと仮定して)。 –

+0

あなたの編集を見た後でコメントを削除しました。タスクの結果を設定する前にDisposeを呼び出すとどうなりますか? –

+1

@ŞafakGür:Task.Disposeのドキュメントに従って、InvalidOperationExceptionがスローされます。 –

関連する問題