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 从技术上回答了最初的问题。真希望我能设置两个接受的答案
编辑:
同样正如@Sriram Sakthivel 在评论中指出的那样,第一个示例将永远等待自己。但实际上并不是死锁。