Правильный способ убить нить в полете, чтобы перезапустить операцию?
У нас есть одна длинная (ish) операция в нашем приложении, Calculate
Это занимает около 5 секунд. Этот пост в основном идентичен тому, что я делаю, но рассматривает только завершенные темы. Все, что вызывает Calculate
должен убить любой запущенный calc и перезапустить его. Судя по сообщениям, подобным этому, кажется, что 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()
Кажется, это работает, но это правильное решение?
Обновление: учитывая, что мой сценарий использования состоит в том, что существует только один из этих потоков, и, как отмечает Крис ниже, Abort может сделать это не сразу, если я буду использовать SyncLock через кишки Calculate
?
1 ответ
Не убивай нить. Объявите переменную логической переменной в области видимости, доступной как для метода Calc, так и для кода, который может ее отменить. Измените метод Calc, чтобы периодически проверять переменную, и если она имеет значение true, то выходить. Чтобы "убить" поток, просто установите переменную.