2009-10-08 19 views
7

私は非同期操作(一連のネットワークIO)でタイムアウトを実装していますが、どちらが「より良い」(割り当て/パフォーマンスから)という観点からはわかりません。 EventWaitHandleとRegisterWaitForSingleObjectを使用するか、単にTimerを作成し、Tickを使用するだけです。.Netタイムアウト:WaitForSingleObjectとタイマー

特定のケースでは、EventWaitHandleは遅延生成されますが、明らかにWaitForSingleObjectを使用するようにインスタンス化する必要があります。だからこれは実際にWaitHandle + WaitForSingleObjectとTimerのリソースコストに関する質問です。どちらのアプローチも実装が簡単です。

私はさまざまな時に両方を実装しているので、私は地形を理解しています。どちらのアプローチが「より良い」か分かりません。

答えて

3

MicrosoftのMorgan Skinner seems to prefer RegisterWaitForSingleObject

限り割り当てが懸念しているように、反射器は、タイマーがTimerBase内部、ならびに_TimerCallbackという名前のクラスを作成しながらRegisterWaitForSingleObjectは、RegisteredWaitHandleのインスタンスを作成することを明らかにする。 1つは、これらのクラスのサイズなどを比較することができますが、より依存性があり、特に管理されていないもの(どちらも基本的なWin32関数を使用しています)なので、まったく正直な答えはありません。

RegisterWaitForSingleObjectに渡される待機ハンドルに関しては、1つのMaunal/AutoResetEventを割り当ててすべての呼び出しに渡すことができます(タイムアウトをカウントしているので、決してそれを通知しません) 。

パフォーマンスが向上する限り、どちらもわかりません。 ThreadPoolは、RegisterWaitForSingleObjectで登録された63アクションごとに特別な待機スレッドを使用します。対照的に、タイマーは基本となるwin32タイマーを使用します。どちらも実際の実行のためにThreadPoolワーカースレッドを使用して終了します。どちらのシナリオが良いですか?私は...打つので、私はこの1つ上のスキナーで行くと思います:)

をも参照してください:

+0

彼のブログ記事は使い方をよく比較していますが、どちらか一方を優先させることを強く推奨するものではありません。そして私がそれについて考えればするほど、カーネルの移行などの点で違いは見られませんでした。基本的なWin32 APIとのコスト差があるかどうかを知りたいのですが、.net実装の「重み」も私が見つけた最高の答えのようです。 – piers7

1

なし。タイマーは、あなたのスレッドを定期的に「ポーク」して何かをするために使用されます。 WaitForSingleObjectはハンドルを待機します。タイムアウトがあるので、デッドロックに陥るのではなく待機を止めることにします。タイマーを使用してwaitforsingleオブジェクトをロックから解除する必要はありません。

両方のリソースコストはごくわずかです。私はあなたが持っているコード状況に非常に依存しているので、どのアプローチを使うべきかを言いません。

+2

私は同意しません。これは簡単な質問です:タイマーを割り当てるコストと、waithandleとWaitForSingleObjectを割り当てるコストです。どちらもOSのリソースです。私の状況にかかわらず、誰かが他の人よりも費用がかかります。 このシナリオでは、私は 'one off'タイマーについて話していますが、*両方とも定期的にあなたのコードをポックするために使用できます - RegisterWaitForSingleObjectに 'executeOnlyOnce'フラグを使用できます... – piers7

関連する問題