跨线程边界传输数据[英] Transfer data across thread borders

问题描述

各位专家,

这是用于半自动硬件设备测试.用户将待测设备("被测者")置于仪器内.
然后用户点击一个按钮.它是此上下文中的唯一按钮.它不在键盘上,而是属于设备.正在处理按钮点击,并最终作为事件到达应用程序.

应用程序核心是一系列任务.实现这一目标的最简单方法是使用一些语句,例如

Task0();等待用户按钮();Task1("Foo", "Bar");Task2(24);等待用户按钮();任务3();

有趣的部分是 WaitForUserButton().
在执行下一个语句之前,用户必须与被测试者打交道,然后按下他的按钮来宣布序列可以继续.

为了管理序列的阻塞和继续,我使用了 System.Threading.AutoResetEvent[^] 这样:
使用 System.Threading;private AutoResetEvent _autoResetEvent = new AutoResetEvent(false);void MyBase_ExternalButtonPressed(){_autoResetEvent.Set();}private void WaitForUserButton(){MyBase.ExternalButtonPressed += MyBase_ExternalButtonPressed;_autoResetEvent.WaitOne(TimeSpan.FromMilliseconds(100));MyBase.ExternalButtonPressed -= MyBase_ExternalButtonPressed;}


现在我需要使用这样的事件处理程序签名对另一个事件做出反应:
public delegate void ParameterPackedDelegate(int foo);
我只是不明白如何将 foo 值放入 WaitForSomeEvent().

如何将数据附加到 AutoResetEvent.Set()?

推荐答案

您不能将任何数据附加到 EventWaitHandle.我认为您甚至不知道等待句柄的目的.您的代码是事件线程同步原语的奇怪混合,并且似乎根本不合理.在事件实例的调用列表上使用"-="运算符通常是个坏主意.您应该记住的一件事是 .NET 事件和事件等待句柄几乎没有共同点,它们是完全不同且不相关的概念.

由于您没有真正解释此活动的目标,因此很难为您提供帮助.

也许您会从我过去的解决方案中得到一些想法,以回答其他问题.

关于事件等待句柄:
线程中的ManualResetEvent和AutoResetEvent[^],
暂停正在运行的线程[^].

使用它们进行线程通信和数据同步——我的技巧和我介绍阻塞队列的技巧文章,包含完整的源代码和使用示例:用于线程通信和线程间调用的简单阻塞队列[^].

另请参阅有关线程的更多参考资料,我的过去解决方案的链接集合:
如何获取keydown事件在 vb.net 中的不同线程上操作[^],
启用禁用+多线程后控制事件未触发[^].

—SA

本文地址:https://www.itbaoku.cn/post/1395148.html