0

我已经环顾了很长时间了,但没有任何解决方案..

我想要实现的是使用 EventWaitHandle 类来暂停一个线程。

所以,我在一个表单上创建了两个按钮。第一个应该发送一条消息,然后暂停,第二个应该取消暂停第一个按钮的线程,然后发送另一条消息。像那样:

using System;
using System.Windows.Forms;
using System.Threading;

namespace Application
{
    public partial class Form1 : Form
    {
        EventWaitHandle wh = new AutoResetEvent(false);

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            MessageBox.Show("Thread blocked!");
            wh.WaitOne();
            MessageBox.Show("Thread unblocked!");
        }

        private void button2_Click(object sender, EventArgs e)
        {
            wh.Set();
        }
    }
}

但是一旦线程被阻塞wh.WaitOne(),我就不能在整个表单上做任何事情,包括按下第二个按钮或至少关闭它..

我做错了什么?因为我似乎找不到我能找到的示例和我的代码之间的任何区别。

4

1 回答 1

1

您只有 1 个线程。用户界面线程。当您阻止它时,您会阻止整个 UI。

您必须创建第二个线程。

尝试这个:

private void button1_Click(object sender, EventArgs e)
{
    new Thread() {
        void run() {
            MessageBox.Show("Thread blocked!");
            wh.WaitOne();
            MessageBox.Show("Thread unblocked!");
        }
    }.start();
}
于 2015-11-22T10:11:46.520 回答