2012-08-26 4 views
8

私はTPLで多くを読んでおり、キャンセルメカニズムを使用できる方法を見つけました。しかし、私はWaitHandleにこだわりました。WaitHandleでのキャンセル

私はタスクを取り消したい場合、私はCancellationTokenSourceを定義し、それをタスクと共に渡すことができ、私はタスクを取り消すためにThrowIfCancellationRequestedメソッドを使うことができます。

私の質問は、キャンセル目的でWaitHandleを使用する必要があるのですが、単純な取り消しがその状況ではうまくいかない理由は何ですか?

EDIT MSDNのリンク:

ちょうどTPLを学習 http://msdn.microsoft.com/en-us/library/dd997364 .. WaitHandleを使用して聴いて見る..

助けてください..

+0

あなたはあなたのポイントについて詳しく説明することはできます。そして「単純な取り消し」とはどういう意味ですか? –

+0

質問が更新されました。 –

答えて

15

はあなたがタイプManualResetEventSlimの信号を持っていると仮定します信号の設定、キャンセルする操作、またはタイムアウトする操作を待つ必要があります。その後、あなたは次のようにWait methodを使用することができます。

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

をしかし、あなたはタイプManualResetEventの信号を持っている場合は、そのような待機方法はありません。このケースでは、同じ効果を達成するためにCancellationTokenWaitHandleWaitHandle.WaitAny methodを使用することができます: 『WaitHandleを使用する場合は、』

if (WaitHandle.WaitAny(new WaitHandle[] { signal, cancellationToken.WaitHandle }, 
         TimeSpan.FromSeconds(10)) == 0) 
{ 
    // signal set 
} 
else 
{ 
    // cancelled or timeout 
} 
関連する問題