在飞行途中杀死一个线程以便重新开始操作的正确方法是什么?

时间:2016-09-21 14:22:17

标签: .net vb.net multithreading

我们的应用程序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的内容?

1 个答案:

答案 0 :(得分:1)

不要杀死线程。在范围中声明一个volatile布尔变量,该方法可以访问Calc方法和可能取消它的代码。修改Calc方法以定期检查变量,如果为true则退出。要“杀死”线程,只需设置变量即可。