2015-11-22 6 views
0

Я искал вокруг в течение довольно продолжительного времени, но без какого-либо решения ..EventWaitHandle блокирует всю форму

Что я хочу достичь, это использовать класс 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(), я ничего не могу по всей форме, в том числе нажав на вторую кнопку или, по крайней мере, закрыть его сделать ..

Что я сделал не так? Потому что я не могу найти разницы между примерами, которые мог найти, и моим кодом.

ответ

1

У вас есть только 1 нить. Пользовательский интерфейс. Когда вы блокируете его, вы блокируете весь пользовательский интерфейс.

Вам нужно будет создать вторую нить.

Попробуйте это:

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

Спасибо за быстрый ответ! Но где я должен поместить класс обработки wait Event, чтобы только приостановить код, который выполняется при нажатии первой кнопки. Я попытался поместить его в разные места, но с тем же результатом. –

+0

Я отредактировал с примером того, как «исправить» ваш код. – Shloim

+0

Хорошо спасибо! Я не знал, что смогу это сделать, поскольку я довольно новичок в многопоточности и программировании в целом. Еще раз спасибо, и у меня хороший день! –