[英]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.