С#: Как приостановить поток и продолжить, когда произойдет какое-то событие?
Как я могу приостановить поток и продолжить, когда происходит какое-то событие?
Я хочу, чтобы тема продолжалась при нажатии кнопки. Кто-то сказал мне, что 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();
}