[英]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.