我们的应用程序Calculate
中有一个long(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()
此似乎可以使用,但这是正确的解决方案吗?
更新:鉴于我的用例是这些线程中只有一个,并且如下面的Chris所述,如果我使用SyncLock,Abort可能不会立即这样做跨越Calculate
的内容?
答案 0 :(得分:1)
不要杀死线程。在范围中声明一个volatile布尔变量,该方法可以访问Calc方法和可能取消它的代码。修改Calc方法以定期检查变量,如果为true则退出。要“杀死”线程,只需设置变量即可。