2

http://msdn.microsoft.com/en-us/library/tdykks7z.aspx

ドキュメントによると、戻り値は次のとおりです。

「待機を満たしたオブジェクトの配列インデックス。」

つまり、インデックスは設定されたイベントを表し、このコードはそれ自体を待機しているため、デッドロックを引き起こします。

    private static AutoResetEvent waitLock()
    {
        //Wait for any of the events to be signaled 
        AutoResetEvent autoEvent;
        lock(yahooRequests)    //Note: yahoo requests is a array of auto reset events
        {
            int index = AutoResetEvent.WaitAny(yahooRequests);
            autoEvent = yahooRequests[index];
            autoEvent.WaitOne();
        }
        return autoEvent;
    }

そして、このコードは正しいでしょう:

private static AutoResetEvent waitLock()
{
    //waitany returns the index of a successfull wait. So this line returns the reference to a autoresetevent.
    return yahooRequests[AutoResetEvent.WaitAny(yahooRequests)];
}

(私の謙虚な意見では)ドキュメントが100%明確ではないため、確認したいだけです

編集:

@Hans Passantが指摘したように、私の設計には欠陥があり、セマフォを使用する必要がありました。N 個の yahooRequests が関数にアクセスできるようにしたかったためです。しかし、@arno は技術的に最初の質問に答えます。承認済みの回答を 2 つ設定できたらいいのにと思います

編集:

また、コメントで@Sriram Sakthivelが指摘したように、最初の例はそれ自体を永遠に待ちます。しかし、実際にはデッドロックではありません。

4

2 に答える 2

3

WaitHandle.WaitAnyメソッドはイベントを設定しません。待機を満たしたオブジェクトの配列インデックスを返します。これには、待機が必要な場合や、への呼び出しWaitAnyが完了する前にイベントが設定された場合に発生する場合があります。後者の場合、インデックスは待たずに返されます。

于 2013-09-20T15:34:59.700 に答える