16

私はTPLについてたくさん読んでいて、キャンセルメカニズムを使用する方法を見つけました。しかし、私はWaitHandleで立ち往生しました。

タスクをキャンセルしたい場合は、CancellationTokenSourceを定義してタスクと一緒に渡すことができ、ThrowIfCancellationRequestedメソッドを使用してタスクをキャンセルできます。

私の質問は、キャンセルの目的でWaitHandleを使用する必要がある場合、およびその状況で単純なキャンセルが機能しないのはなぜですか?

MSDNリンクの編集: http : //msdn.microsoft.com/en-us/library/dd997364..WaitHandleを使用したリスニングを参照してください。

TPLを学ぶだけです。

助けてください..

4

1 に答える 1

24

タイプがManualResetEventSlimのシグナルがあり、シグナルが設定されるか、操作がキャンセルされるか、操作がタイムアウトするのを待ちたいとします。次に、 Waitメソッドを次のように使用できます。

if (signal.Wait(TimeSpan.FromSeconds(10), cancellationToken))
{
    // signal set
}
else
{
    // cancelled or timeout
}

ただし、ManualResetEventタイプのシグナルがある場合、そのようなWaitメソッドはありません。この場合、CancellationTokenWaitHandleメソッドとWaitHandle.WaitAnyメソッドを使用して、同じ効果を得ることができます。

if (WaitHandle.WaitAny(new WaitHandle[] { signal, cancellationToken.WaitHandle },
                       TimeSpan.FromSeconds(10)) == 0)
{
    // signal set
}
else
{
    // cancelled or timeout
}
于 2012-08-26T12:02:04.763 に答える