Re[17]: .NET5 и CER
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 24.11.20 14:45
Оценка:
Здравствуйте, gusilebedi, Вы писали:

G>Здравствуйте, Serginio1, Вы писали:


S>> Все смеются надомной, но я то всего навсего прошу пример, как такую ситуацию разрулить причем в основном потоке


G>Сколько времени проходит между вызовом Thread.Abort и появлением ThreadAbortException? Может быть вы дергаете Thread.Abort, unmanaged функция спокойно завершается, управление возвращается в CLR и тут уже появляется исключение. Если это не так, то нужно какое-то объяснение как может Thread.Abort прервать выполнение unmanaged функции.

Секунд 15 жду. Ну у потока есть функция, можно и бросить исключение.
Функция то внутри может просто ожидать события по WaitOne.
У потока есть функция. Можно остановить поток и запихнуть в регистры код окончания функции.
Вариантов куча.
try-catch (Справочник по C#)
Когда возникло исключение (еы можешь сам вызвать любое исключение для предотваращения кода), то код ниже исключения не выполняется и переходт в catch все тоже самое и Thread.Abort
Проблемы возникают если ты не обработал ThreadAbortException
Thread.Abort Метод

При вызове этого метода в потоке система создает исключение ThreadAbortException в потоке, чтобы его прервать. ThreadAbortException — специальное исключение, которое может быть перехвачено кодом приложения, но повторно создается в конце catch блока, если ResetAbort не вызывается метод. ResetAbort отменяет запрос для прерывания и предотвращает ThreadAbortException завершение потока потоком. Невыполненные finally блоки выполняются до отмены потока.


Хотя там же пишут

Если Abort вызывается в управляемом потоке во время выполнения неуправляемого кода, ThreadAbortException исключение не создается, пока поток не вернется в управляемый код.

Но
Abort call to unmanaged DLL
28

Unmanaged code is only abortable if it is an "alertable wait state". It won't be when it is burning 100% cpu cycles. P/Invoking TerminateThread would work, assuming you could obtain the thread handle, which .NET makes very difficult. It won't help anyway, you'll leak the thread stack. At one megabyte, you'll quickly run out of virtual memory. Even if this only an occasional need, you're still liable to run into major problems since the thread has mutated global program state and you don't know how to restore it.

The only good way to abort unmanaged code is to run it in a separate process and shoot it in the head with Process.Kill(). The operating system will clean up the shrapnel. You'll need to write a little hosting program for the DLL and use one of the process interop facilities to talk to it. Sockets, named pipes, .NET remoting, WCF, take your pick.


28

По русск

Неуправляемый код может быть прерван только в том случае, если он находится в "состоянии ожидания с возможностью оповещения".


У меня как раз такой случай
и солнце б утром не вставало, когда бы не было меня
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.