簡體   English   中英

C# AutoResetEvent 不重置

[英]C# AutoResetEvent does not reset

我花了整整兩天的時間弄清楚為什么我的 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() 處停止並保持等待狀態。 我做錯了什么嗎?

您正在等待該事件兩次,並且在第一次事件被重置之后,因為它是一個自動重置事件。 改變這個:

autoResetEvent.WaitOne(5000);
if (autoResetEvent.WaitOne()== false)
{
    t1.Abort();
}

if (autoResetEvent.WaitOne(5000)== false)
{
    t1.Abort();
}

這樣你就只等一次。

此外,正如其他人所提到的,您的代碼在您等待的整個 5 秒內都在阻塞 gui 線程,這意味着您的應用程序將變得無響應。 您應該查看其他選項,例如使用async / await

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM