2011-09-15 19 views
5

を一致させるために、私は.NETC++ APIコードを移植し、WaitForMultipleObjectsの代替としての関数呼び出しWaitHandle.WaitAnyに探したが.NET4でデバッグするとき、私はこの機能がWaitHandle.WaitAnyがたWaitForMultipleObjectsに機能

private static extern int WaitMultiple(
           WaitHandle[] waitableSafeHandle, 
           int msTimeOut, 
           bool exitContext, 
           bool WaitAll); 

にフックされていることを見ることができていますし、これは、この機能がポートにとって魅力的ではないと私に思い出させます。その他の提案はありますか?

+2

なぜですか?複数の待機ハンドルも指定できます – sll

+3

なぜWaitAnyは適切ではないと思いますか? – dtb

答えて

3

ほとんど同じシグネチャと動作ですので、良い候補です。 WaitForMultipleObjects()WaitAll=trueで呼び出された場合は1、または指定したオブジェクトのすべてが合図 状態または

経過タイムアウト間隔になるまで、あなたにも WaitHandle.WaitAll()

C++ WaitForMultipleObjects()

DWORD WINAPI WaitForMultipleObjects(
    __in DWORD nCount, 
    __in const HANDLE *lpHandles, 
    __in BOOL bWaitAll, 
    __in DWORD dwMilliseconds 
); 

待機を使用することができます


C# WaitHandle.WaitAny()

public static int WaitAny(
    WaitHandle[] waitHandles, 
    TimeSpan timeout, 
    bool exitContext 
) 

指定された配列の要素のいずれかを待つ時間間隔と待機前に同期ドメインを終了するかどうか を指定する指定したTimeSpanを使用して、 信号を受信します。

.NETは、他の方法WaitHandle.WaitAll()を提供していますが、すべてのハンドルが信号を受信して​​いることを確認する必要がある場合には便利。

8

WaitHandle.WaitAny()は、WaitForMultipleObjects()の機能に一致するには十分ではありません。しかし、WaitHandle.WaitAll()も使う必要があります。 FALSEに設定WaitAllパラメータで呼び出さ

  • WaitHandle.WaitAny()試合WaitForMultipleObjects()、。
  • WaitHandle.WaitAll()WaitAllと一致し、TRUEに設定されています。
2

これは、フードの下でWaitForMultipleObjects()を使用しても問題ありません。あなたはこの小さなテストプログラムで見つけることができます:

using System; 
using System.Threading; 

class Program { 
    static void Main(string[] args) { 
     var waits = new WaitHandle[65]; 
     for (int ix = 0; ix < waits.Length; ++ix) waits[ix] = new ManualResetEvent(false); 
     WaitHandle.WaitAny(waits); 
    } 
} 

WaitForMultipleObjectsと同じ制限があります。 WaitMultiple()メソッドは、実際にはCLR内に存在するため、MethodImplOptions.InternalCallとマークされています。これは、いくつかの管理されたスレッドの保証を提供するために待機をブロックすることについて知りたい。 COMを幸せに保つためにUIスレッドでメッセージループをポンピングする(MsgWaitForMultipleObjects)と、次の要求に対してリモートリクエストが中断されるタイミングを知り、スレッドが安全な状態になってアボート要求を受け入れるタイミングを知る。

関連する問題