等待事件从由它生成的后台线程触发主线程

时间:2014-01-06 03:48:06

标签: c# multithreading waithandle

我遇到的情况是我在最初从事件触发的线程中处理一些数据,但它需要等到主线程中发生某些事情才继续 - 问题是可能有任何数量的这些运行同时。真正的基本例子:

触发事件 - >方法设置为在其自己的线程中在后台运行 - >使用主线程的发送数据方法发送数据 - >等待ACK接收该数据 - >在主线程上设置WaitHandle - >然后工作者线程将发送下一组数据 - >重复 - >发送所有数据并确认后退出线程。

目前我有一个AutoResetEvent,每次ACK进入时都会设置 - 并且正在运行的工作线程将监听它 - 但是如果碰巧有10个工作线程同时运行,并且它们都在监听对它 - 它失败了目的。

我需要生成工作线程,让它监听(WaitOne)以设置/重置特定的WaitHandle,并仅基于此继续。

完成这样的事情的最佳方法是什么?以某种方式创建一个WaitHandles数组并让工作线程监听其索引的AutoResetEvent?

2 个答案:

答案 0 :(得分:0)

我认为你在抽象中挖得太低了。有没有理由你不能使用更典型的生产者 - 消费者模型和一两个队列来处理飞行中的请求和响应?当您不尝试重新创建低级同步原语时,将它更容易纠正。

答案 1 :(得分:0)

我不确定你的线程和你的其他进程是否正在交互的确切方式,但我之前使用的模式是字典,其中手动或自动重置事件是值,并且你设置某种类型的ID作为密钥,例如事件,事件发送者,用户ID等。

通过这种方式,您可以在字典中搜索相关ID(使用默认索引器),然后等待句柄。如果需要异步向列表中添加等待句柄(例如,在引发事件时),您可能需要使用ConcurrentDictionary类。我不确定你需要什么,但如果你需要在完成某些动作之前等待所有事件完成,你也可以查看一个队列。

注意跨线程同步。您不希望在GUI应用程序上阻止主线程,也无法从同一线程编辑GUI