Здравствуйте, pilgrim_, Вы писали:
_>Здравствуйте, Serginio1, Вы писали:
S>>Для примера есть системный код который зависает по неизвестным причинам. При этом нет никакого async и CancellationToken. Можно по истечении времени кинуть Thread.Abort отловить его и сделать Thread.ResetAbort S>>Во всяком случае можно дальше работать или отвиснуть поток, что бы не копились
_>Если "системный код" — это неуправляемый код, то Thread.Abort тут ничем не поможет, т.к. Thread.Abort реализован средствами CLR (соотв. никак не связан с TerminateThread) — проставляется спец. флаг что требуется Abort, который в определенных, хз каких, местах исполняемого кода проверяется, известно только где не проверяется (catch, finnaly, CER, неуправляемый код, может где еще). По этому флагу и генерится исключение ThreadAbortException, который можно перехватить и да, сбросить его (ResetAbort).
Как это не поможет. Есть два пути
1. В основном коде вызываем в try catch и запускаем наблюдающий поток и если завис бросаем Thread.Abort
2. Запускаем отдельный поток в котором в блоке try catch вызывается проблемная функция и через таймаут бросаем Thread.Abort.
Реально Thread.Abort в связке Thread.ResetAbort работает и в основном потоке. Практика!
и солнце б утром не вставало, когда бы не было меня