Правильный способ убить нить в полете, чтобы перезапустить операцию?

У нас есть одна длинная (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, то выходить. Чтобы "убить" поток, просто установите переменную.

Другие вопросы по тегам