首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C# AutoResetEvent未重置

C# AutoResetEvent未重置
EN

Stack Overflow用户
提问于 2020-03-31 18:51:57
回答 1查看 52关注 0票数 0

我花了整整两天的时间弄清楚为什么我的WinForms应用程序中的线程无法工作。我真的需要一些帮助。

在我的应用程序中,button1_Click事件将调用一个方法,但如果该方法运行太长时间,我想中止它。

代码语言:javascript
复制
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()处停止,并保持等待状态。我做错什么了吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-31 19:05:39

您等待该事件两次,并且在第一次重置事件之后,因为它是一个自动重置事件。更改此设置:

代码语言:javascript
复制
autoResetEvent.WaitOne(5000);
if (autoResetEvent.WaitOne()== false)
{
    t1.Abort();
}

代码语言:javascript
复制
if (autoResetEvent.WaitOne(5000)== false)
{
    t1.Abort();
}

这样你就只需要等待一次。

此外,正如其他人所提到的,您的代码在您等待的整个5秒内阻塞了gui线程,这意味着您的应用程序将变得没有响应。您应该考虑其他选项,例如使用async/await

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60948852

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档