C #: Как приостановить поток и продолжить, когда происходит какое-то событие? - PullRequest
16 голосов
/ 31 января 2011

Как я могу приостановить поток и продолжить, когда происходит какое-то событие?

Я хочу, чтобы поток продолжал работу при нажатии кнопки.Кто-то сказал мне, что thread.suspend - неправильный способ приостановить поток.Есть ли другое решение?

Ответы [ 3 ]

18 голосов
/ 31 января 2011

Вы можете использовать System.Threading.EventWaitHandle .

EventWaitHandle блокируется, пока не будет сообщено. В вашем случае это будет сигнализироваться событием нажатия кнопки.

private void MyThread()
{
    // do some stuff

    myWaitHandle.WaitOne(); // this will block until your button is clicked

    // continue thread
}

Вы можете указать свой дескриптор ожидания следующим образом:

private void Button_Click(object sender, EventArgs e)
{
     myWaitHandle.Set(); // this signals the wait handle and your other thread will continue
}
8 голосов
/ 31 января 2011

Действительно, приостановка потока - это плохая практика, так как вы очень редко точно знаете , что поток делает в то время.Более предсказуемо, чтобы поток проходил мимо ManualResetEvent, вызывая WaitOne() каждый раз.Это будет действовать в качестве шлюза - управляющий поток может вызвать Reset() для закрытия шлюза (приостановка потока, но безопасно) и Set() для открытия шлюза (возобновление потока).Вы можете вызывать WaitOne в начале каждой итерации цикла (или один раз каждые n итераций, если цикл слишком узкий).

3 голосов
/ 26 июля 2013

Вы можете попробовать это также

private static AutoResetEvent _wait = new AutoResetEvent(false);

public Form1()
    {
        InitializeComponent();
    }

private void Form1_Load(object sender, EventArgs e)
    {
        Control.CheckForIllegalCrossThreadCalls = false;
        backgroundWorker1.RunWorkerAsync();
    }
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        Dosomething();
    }

private void Dosomething()
{
 //Your Loop
 for(int i =0;i<10;i++)
   {
    //Dosomething
    _wait._wait.WaitOne();//Pause the loop until the button was clicked.

   } 
}

private void btn1_Click(object sender, EventArgs e)
    {
        _wait.Set();
    }
...