gpt4 book ai didi

c# - waitany(Array) 实际上 'set' 是一个事件,还是只是返回有信号事件的索引

转载 作者:行者123 更新时间:2023-12-03 12:49:16 26 4
gpt4 key购买 nike

http://msdn.microsoft.com/en-us/library/tdykks7z.aspx

根据文档,返回值为:

"The array index of the object that satisfied the wait."

这意味着索引代表一个已设置的事件,并且此代码将导致死锁,因为它会等待自身:

    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 完成之前设置事件时发生。在后一种情况下,索引将立即返回,无需等待。

关于c# - waitany(Array) 实际上 'set' 是一个事件,还是只是返回有信号事件的索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18919875/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com