0

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

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

目前我有一个 AutoResetEvent ,每次收到 ACK 时都会设置 - 并且正在运行的工作线程会监听它 - 但如果碰巧有 10 个工作线程同时运行,并且它们都在监听它 -它违背了目的。

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

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

4

2 回答 2

0

I think you're digging a little too low-level in your abstractions. Is there a reason you can't use a much more typical producer-consumer model with a queue or two to handle in-flight requests and responses? It's going to be a lot easier to get it correct when you're not trying to recreate low-level synchronization primitives.

于 2014-01-06T03:55:13.430 回答
0

我不确定您的线程和其他进程交互的确切方式,但我之前使用的模式是字典,其中手动或自动重置事件是值,并且您将某种 ID 设置为键,例如事件、事件发送者、用户 ID 等等。

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

注意跨线程同步。您不想在 GUI 应用程序上阻塞主线程,并且不能从同​​一线程编辑 GUI

于 2014-01-06T04:10:47.983 回答