0

私はかなり長い間周りを見回してきましたが、解決策はありません..

私が達成したいのは、1 つのスレッドを一時停止するために EventWaitHandle クラスを使用することです。

そこで、フォームに 2 つのボタンを作成します。最初のボタンはメッセージを送信してから一時停止し、2 番目のボタンは最初のボタンのスレッドの一時停止を解除し、別のメッセージを送信します。そのように:

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()、2 番目のボタンを押すことや、少なくともフォームを閉じることなど、フォーム全体で何もできなくなります。

私は何を間違えましたか?私が見つけた例と私のコードの間に違いが見つからないように見えるからです。

4

1 に答える 1

1

スレッドは 1 つしかありません。UI スレッド。ブロックすると、UI 全体がブロックされます。

2 番目のスレッドを作成する必要があります。

これを試して:

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 に答える