waitany(Array)是否真的“设置”了一个事件,或者它只是返回一个信号事件的索引

本文关键字:一个 事件 返回 信号 索引 或者 设置 真的 waitany Array 是否 | 更新日期: 2023-09-27 18:32:13

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% 清楚的

编辑:

我的设计是有缺陷的,我应该像Passant指出的那样使用信号量@Hans。因为我想确保N个雅虎请求可以访问一个功能。但从技术上讲,@arno回答了最初的问题。真的希望我能设置两个被接受的asnwer

编辑:

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

waitany(Array)是否真的“设置”了一个事件,或者它只是返回一个信号事件的索引

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

因此,这意味着索引表示已等待的事件

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