С#: Как приостановить поток и продолжить, когда произойдет какое-то событие?

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

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

Ответы

Ответ 1

Вы можете использовать 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
}

Ответ 2

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

Например, вы могли бы вызвать WaitOne в начале каждой итерации цикла (или один раз каждые n итерации, если цикл слишком туго).

Ответ 3

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

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();
    }