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在评论中指出的那样,第一个例子将永远等待自己。但实际上并不是僵局。
WaitHandle.WaitAny
方法不设置事件。它返回满足等待的对象的数组索引。这可能需要等待,也可能在对WaitAny
调用完成之前设置事件时发生。在后一种情况下,索引将返回而无需等待。
因此,这意味着索引表示已等待的事件
否,数组中的所有事件都已等待。 返回的索引只是第一个 Set() 索引。 它将在 WaitAny() 返回后重置。 所以第一个片段确实没有意义,你不想再调用 WaitOne()。 第二个代码段没有多大意义,您返回的 AutoResetEvent 对象没有任何独特之处。 特别是它不再发出信号,因为 ARE 会自动重置自身。 您确实需要知道索引才能知道哪个特定工作已完成。