繁体   English   中英

waitany(Array)实际上是“设置”一个事件,还是只是返回一个信号事件的索引

[英]Does waitany(Array) actually 'set' a event, or does it just return the index of a signaled event

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在评论中指出的那样,第一个示例将永远等待自己。 但是实际上并不是僵局。

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

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

不,阵列中的所有事件都在等待。 返回的索引只是Set()的第一个索引。 在WaitAny()返回之后,它将被重置。 因此,第一个代码片段确实没有任何意义,您不想再次调用WaitOne()。 第二个片段没有多大意义,您返回的AutoResetEvent对象没有任何区别。 特别是,由于ARE自动重置,因此不再发出信号。 您确实确实需要知道索引才能知道完成了哪些特定的工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM