2016-09-21 43 views
0

我們在我們的應用程序Calculate中有一個長(ish)操作,需要大約5秒鐘才能完成。 This post與我所做的基本相同,但只考慮完成的線程。任何觸發Calculate的應該會終止任何正在運行的calc,然後重新啓動它。它似乎,基於this one等職位,ThreadPool可以解決這個問題,但可能不是這些一次性案件的適當解決方案。爲了重新開始操作,正確的殺死線程中間線程的方法?

所以我的問題是如何正確處置「舊的」,如果它仍然是。我目前在做...

If CalcThread IsNot Nothing Then 
    CalcThread.Abort() 
    CalcThread = Nothing 
End If 
If CalcThread Is Nothing Then 'one assumes this will always be true 
    CalcThread = New Threading.Thread(AddressOf InternalCalculate) 
    CalcThread.IsBackground = True 
End If 
CalcThread.Start() 

出現工作,但這是正確的解決

更新:鑑於我的用例是有隻有這些線程的單一一個,正如克里斯低於指出,中止可能不會做,馬上,我應該使用跨越的膽量的SyncLock Calculate

+0

這是一篇關於Thread.Abort邪惡的好文章https://www.interact-sw.co.uk/iangblog/2004/11/12/cancellation – FloatingKiwi

+0

我已經閱讀過那篇文章,但這不是一個考慮因素這裏是因爲沒有共享數據或其他任何將被公開的內容。我想我真正的問題是「我可以將線程設置爲Nothing並繼續」? –

回答

1

不要殺死線程。在Calc方法和可能取消它的代碼都可以訪問的作用域中聲明一個易變的布爾變量。修改Calc方法以定期檢查變量,如果它是true,則退出。要「殺死」線程,只需設置變量即可。

+0

你不能在VB.net中聲明volatile。有辦法做同樣的事情,但它們有點難看。正如我上面提到的,主線程和線程之間沒有共享數據,所以.Abort似乎不是一個問題 - 沒有任何事情可以保持開放。 –

+0

公平的迴應:volatile-使用一種解決方法。線程異常終止是不好的,但是 - 可能沒有共享數據,但Calc方法的結果會怎樣?中止線程可以使輸出保持半承諾狀態嗎? –

+0

它可以,但新線程將做的第一件事是空的狀態。那麼,如果我不中止並將其設置爲Nothing,究竟會發生什麼?它會繼續運行,然後在退出時消失嗎? –