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 从技术上回答了最初的问题。真希望我能设置两个接受的答案

编辑:

同样正如@Sriram Sakthivel 在评论中指出的那样,第一个示例将永远等待自己。但实际上并不是死锁。

4

2 回答 2

3

WaitHandle.WaitAny方法不设置事件。它返回满足等待的对象的数组索引。这可能需要等待,或者在调用完成之前设置事件时也可能发生WaitAny。在后一种情况下,将立即返回索引。

于 2013-09-20T15:34:59.700 回答
2

所以这意味着索引代表一个已被等待的事件

不,数组中的所有事件都在等待。返回的索引只是 Set() 中的第一个索引。WaitAny() 返回后将被重置。所以第一个片段确实没有意义,你不想再次调用 WaitOne() 。第二个片段没有多大意义,您返回的 AutoResetEvent 对象没有什么特别之处。特别是它不再发出信号,因为 ARE 会自动重置自己。您确实需要知道索引才能知道完成了哪些特定工作。

于 2013-09-20T15:17:48.983 回答