19

キャンセル トークンが与えられたら、そこから待機可能なタスクを作成したいと思います。このタスクは決して完了しませんが、キャンセルすることができます。IMO が非常に一般的な次のようなパターンに必要です。

async Task DoStuff(Task t, CancellationToken ct)
{
   // t was made from TaskCompletionSource, 
   // both t and ct are beyond my control

   Task t2 = TaskFromCancellationToken(ct);
   await Task.WhenAny(t, t2);

   // do stuff
}

私がこれまでに得た最高のアイデアはこれです:

Task TaskFromCancelationToken(CancellationToken ct)
{
    return Task.Delay(Timeout.Infinite, ct);
}

このロジックを実現するためのより良い方法はありますか?

4

2 に答える 2

24

それほど一般的ではありませんが、私のAsyncExライブラリの一部になるほど一般的です。私は次のようなものを使用します:

public static Task AsTask(this CancellationToken cancellationToken)
{
    var tcs = new TaskCompletionSource<object>();
    cancellationToken.Register(() => tcs.TrySetCanceled(),
        useSynchronizationContext: false);
    return tcs.Task;
}

更新:最近ではCancellationTokenTaskSource、リソース リークの可能性がなく、すべての有効期間を適切に処理する のようなものを使用することをお勧めします。

于 2013-09-07T11:37:59.850 に答える