线程间通信-手动复位事件
本文关键字:复位 事件 -手 通信 线程 | 更新日期: 2023-09-27 18:05:29
我正在尝试建立线程之间的暂停和播放通信。我在启动时为两个窗体生成两个线程,一个是用于主窗口的主线程,第二个线程是form2,
var thread = new Thread(ThreadStart);
thread.TrySetApartmentState(ApartmentState.STA);
thread.Start();
private static void ThreadStart()
{
Application.Run(new SecondForm()); // other form started on its own UI thread
}
主窗口有一个按钮,点击该按钮会为不同的操作产生多个线程-它会不暂停地执行,直到预期的任务完成。
在第二种形式中,我有两个按钮停止,并开始单击,我应该能够停止和启动主窗口(所有子线程)。
为此我声明public static ManualResetEvent more = new ManualResetEvent(false);
在program.cs中启动两个UI线程然后在start和stop
中调用第二种形式private void btnStop_Click(object sender, EventArgs e)
{
Invoke((MethodInvoker) delegate
{
Program.mre.WaitOne();
});
}
private void btnStart_Click(object sender, EventArgs e)
{
Invoke((MethodInvoker) delegate
{
Program.mre.Set();
});
}
一旦我单击主窗口上的按钮,继续进行一系列操作,我尝试在secondform中单击STOP按钮,这禁用了第二种形式,并且主窗口的操作继续,请让我知道我在哪里出错。
除了这是一个完全愚蠢的线程设计之外,还有两个问题:
- 你在第二种形式上
Invoke
,所以你阻塞了它的消息传递循环。相反,你会想做mainWindow.Invoke( ... )
。 - 当主窗口生成工作线程时,即使这样也不会帮助你。它只会停止表单的消息循环,而不会停止已经生成的线程。
我找到了一个解决问题的方法。当我点击暂停按钮,我设置一个bool说继续为false,并使用这个变量在一个循环中,实际调用函数是完成的。
在我有循环的同一个类中,我初始化了手动重置事件,当continue为false时,我调用mre.WaitOne(),这将暂停当前线程的执行,而不会对其他线程造成任何伤害。
当点击Play时,我正在设置手动重置事件对象,这将重新启动线程。