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が指摘したように、最初の例はそれ自体を永遠に待ちます。しかし、実際にはデッドロックではありません。