簡體   English   中英

線程停止得不夠快

[英]Thread doesn't stop fast enough

嗨,抱歉我的英語不好,

在我的WPF應用程序中,我有一個RepeatButton,它增加滑塊值。

每次更改滑塊值時,我都必須停止一個正在生成圖片的線程,然后根據新的滑塊值再次運行該線程:

  Console.WriteLine("Request stop !");
                requestStop();
                Console.WriteLine(bw.IsAlive.ToString());

                valuetogenerate = searchValueToGenerate();

                bw = new Thread(() => bw_DoWork());
                requestStart();
                bw.Start();

宣言

 private volatile bool _shouldStop;

我的requestStop和start方法:

  public void requestStop()
    {
        _shouldStop = true;
    }

    public void requestStart()
    {
        _shouldStop = false;
    }

和工作:

 while (!_shouldStop && !(allvaluegenerated))
        {

            for (int i = 0; i < valuetogenerate.Count - 1; i++)
            {

             Console.WriteLine("i :" + i + " " + System.Threading.Thread.CurrentThread.ManagedThreadId.ToString());

                if (!_shouldStop)
                {

                      .... generating pictures     

                }
                else
                {
                     i = valuetogenerate.Count + 1;
                }
            }
        }

 Console.WriteLine("Thread stopped");

問題是線程沒有足夠快地停止(我認為...),這是我的輸出窗口,在我值之后具有線程ID:

 Number of value to generate : 6
 Begin generation : 
 i :0 15
 i :1 22
 i :1 23
 i :2 21
 i :2 20
 i :1 19
 i :1 15
 i :2 22
 i :2 23
 i :2 19
 i :3 20
 i :3 21
 i :2 15
 i :3 19
 i :3 22
 i :3 23
 i :4 20
 i :4 21
 i :3 15
 i :4 22
 i :4 19
 Thread stopped
 i :4 23
 Thread stopped
 i :4 15
 Thread stopped
 Thread stopped
 Thread stopped
 Thread stopped

如您所見,當我請求停止時,線程沒有停止。

在requestStop之后使用thread.abort解決了我的問題,但這不是停止線程的最優雅方法。

您應該只請求取消線程,然后讓線程自己處理該取消過程。 如果那意味着線程需要一段時間,那就可以了。 中止線程只能作為不得已的方法。

但是無論如何...當_shouldStop == true時,為什么不中斷循環?

if (!_shouldStop)
{
  .... generating pictures     
}
else
{
   break;
}

啊,我知道...您正在設定i的值,以便循環條件發生變化

如果您需要在異步情況下(例如兩個線程)進行交互(例如停止/啟動),則總是會有延遲。 因此,您不能期望發出命令“ stop”並且期望它會立即停止。

想想兩個人通過電子郵件通信-您永遠都不知道對方何時閱讀了該消息-如果您需要知道,則必須等待答復並定期檢查。

  • 一種方法是阻塞自己的線程,直到另一種線程停止為止,這樣您就可以保持程序流(但是不能在主線程中執行任何其他操作)。

  • 另一個選擇是實現某種事件,該事件在線程停止時觸發,並將“線程停止代碼之后”放置在該事件中。

  • 您還可以按一定間隔檢查線程是否已停止,然后再繼續。

  • 一些框架類(例如Task提供了一種在任務完成后執行某些代碼的方法,這可能是“在線程停止代碼之后”的地方。

  • async / await模式也可能對您有所幫助。 看一下這個頁面 我認為這是最先進的方法,一旦您習慣了它也很容易使用。

有很多選項,每個選項都有不同的復雜性,性能和(缺點)優勢。 選擇最適合您的需求。

暫無
暫無

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

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