Shocker.Pro |
---|
Еще раз. у меня есть СИНХРОННАЯ чужая операция. Я не могу влезть к ней внутрь. В примере подобную операцию представляет SyncLock
Вопрос конкретно по примеру. Можно ли прервать выполнение SyncLock до его реального завершения (не внося изменения в SyncLock) используя работу с Task-ами? |
У вас принципиальное непонимание того, как работает программа. Поток - это набор инструкций. Его нельзя взять, и остановить в произвольном месте. Любая операция по нормальной остановке какой-либо задачи выглядит следующем образом:
1) Когда вам надо остановить задачу, вы выставляете где-то флажок, что надо остановиться.
2) Сама задача периодически проверяет этот флажок, и если видит, что надо остановиться - останавливается.
Принципиально так реализовано все. Так реализованы прерывания IO операций, так реализованы прерывания через CancellationToken, так реализованы прерывания ожидания всяких критических секций и условий, и т.д.. Разумеется, конечная реализация может отличаться - где-то это просто managed-переменная, где-то вызов какого-нибудь WinAPI, где-то вызов прерывания, и т.д.. Но суть одна - "первый поток ставит флажок, второй поток читает флажок".
Вы же прерываете поток через Abort(). Это плохая, отвратительная практика. В Java, например, это вообще запрещено. И правильно, что запрещено - это дурной тон! А что, если ваш поток, например, сидел внутри критической секции и должен был консистентно изменить две переменные, а вы вызвали Abort, и он смог изменить только одну, оставив систему в неконсистентном состоянии? Abort() используют либо от лени, либо от непонимания.
Если вас по каким-то причинам не устраивает cancellation token, то сделайте какой-нибудь volatile bool - один поток выставляет его, второй читает.