首页 / C# / c# – 多个线程在等待一个事件?
c# – 多个线程在等待一个事件?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 多个线程在等待一个事件?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2100字,纯文字阅读大概需要4分钟。
内容图文
![c# – 多个线程在等待一个事件?](/upload/InfoBanner/zyjiaocheng/826/266fc53aa57a4280b7b8d74731b95cbc.jpg)
我想要的是AutoResetEvent的等效,多个线程可以等待,所有这些都在设置时恢复.
我知道这可以通过为每个线程设置一个AutoResetEvent并设置每个线程来实现 – 但是有更简单的方法吗?一种不依赖于事件句柄数组的方法?
有效的(我认为)我希望能够做到这一点:
private volatile string state;
private MultiEventHandle stateChanged = new MultiEventHandle();
public void WaitForBlob()
{
while (true)
{
object saved = stateChanged.Current; // some sentinel value
if (state == "Blob") break;
stateChanged.WaitTilNot(saved); // wait til sentinel value != "current"
}
}
public void SetBlob()
{
state = "Blob";
stateChanged.Change(); // stateChanged.Current becomes a new sentinel object
}
也就是说,任何数量的线程都可以调用WaitForBlob,并且在任何时候(没有竞争条件)SetBlob可以被另一个线程调用,并且所有等待的线程将立即检测到更改 – 更重要的是,没有自旋锁或Threading.Sleeps.
现在我想我可以相对容易地实现“MultiEventHandle”.但我的问题是……有更好的方法吗?当然,我认为这是错误的,因为它必须是一个非常常见的用例,但我似乎无法找到一个内置的工具.我担心我可能会在这里发明一个方形轮子.
解决方法:
我已经使用Monitor.PulseAll / Wait在幕后编写了一个可能的解决方案到了一个“WatchedVariable”类中(在这个过程中学习了一下Monitor类).如果其他任何人遇到同样的问题,这里发布 – 可能与不可变数据结构有关.感谢Jon Skeet的帮助.
用法:
private WatchedVariable<string> state;
public void WaitForBlob()
{
string value = state.Value;
while (value != "Blob")
{
value = state.WaitForChange(value);
}
}
执行:
public class WatchedVariable<T>
where T : class
{
private volatile T value;
private object valueLock = new object();
public T Value
{
get { return value; }
set
{
lock (valueLock)
{
this.value = value;
Monitor.PulseAll(valueLock); // all waiting threads will resume once we release valueLock
}
}
}
public T WaitForChange(T fromValue)
{
lock (valueLock)
{
while (true)
{
T nextValue = value;
if (nextValue != fromValue) return nextValue; // no race condition here: PulseAll can only be reached once we hit Wait()
Monitor.Wait(valueLock); // wait for a changed pulse
}
}
}
public WatchedVariable(T initValue)
{
value = initValue;
}
}
虽然它通过了我的测试用例,但使用风险自负.
现在请咨询meta以找出我应该接受的答案.
内容总结
以上是互联网集市为您收集整理的c# – 多个线程在等待一个事件?全部内容,希望文章能够帮你解决c# – 多个线程在等待一个事件?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。