我花了整整两天的时间弄清楚为什么我的WinForms应用程序中的线程无法工作。我真的需要一些帮助。
在我的应用程序中,button1_Click事件将调用一个方法,但如果该方法运行太长时间,我想中止它。
private void button1_Click(object sender, EventArgs e)
{
button1.Enabled = false;
Thread t1 = new Thread(new ThreadStart(ExtractData));
t1.Start();
//Wait for 5 seconds, if t1 is not finished executing, abort the thread
autoResetEvent.WaitOne(5000);
if (autoResetEvent.WaitOne()== false)
{
t1.Abort();
}
button1.Enabled = true;
}
private void ExtractData()
{
//Get data from web service..
autoResetEvent.Set();
}我认为button1_Click事件是我的主线程,而ExtractData()将在线程t1中。在ExtractData()完成它的工作之后,我希望autoResetEvent.Set()在主线程中唤醒autoResetEvent.WaitOne() &这样就可以完成主线程的执行了。但是,主线程将在autoResetEvent.WaitOne()处停止,并保持等待状态。我做错什么了吗?
发布于 2020-03-31 19:05:39
您等待该事件两次,并且在第一次重置事件之后,因为它是一个自动重置事件。更改此设置:
autoResetEvent.WaitOne(5000);
if (autoResetEvent.WaitOne()== false)
{
t1.Abort();
}至
if (autoResetEvent.WaitOne(5000)== false)
{
t1.Abort();
}这样你就只需要等待一次。
此外,正如其他人所提到的,您的代码在您等待的整个5秒内阻塞了gui线程,这意味着您的应用程序将变得没有响应。您应该考虑其他选项,例如使用async/await。
https://stackoverflow.com/questions/60948852
复制相似问题