线程间通信-手动复位事件

本文关键字:复位 事件 -手 通信 线程 | 更新日期: 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时,我正在设置手动重置事件对象,这将重新启动线程。