namespace System.Threading
{
public sealed partial class Thread : CriticalFinalizerObject
{
// …
[Obsolete(Obsoletions.ThreadAbortMessage, DiagnosticId = Obsoletions.ThreadAbortDiagId, UrlFormat = Obsoletions.SharedUrlFormat)]
public void Abort()
{
throw new PlatformNotSupportedException(SR.PlatformNotSupported_ThreadAbort);
}
[Obsolete(Obsoletions.ThreadAbortMessage, DiagnosticId = Obsoletions.ThreadAbortDiagId, UrlFormat = Obsoletions.SharedUrlFormat)]
public void Abort(object? stateInfo)
{
throw new PlatformNotSupportedException(SR.PlatformNotSupported_ThreadAbort);
}
[Obsolete(Obsoletions.ThreadAbortMessage, DiagnosticId = Obsoletions.ThreadAbortDiagId, UrlFormat = Obsoletions.SharedUrlFormat)]
public static void ResetAbort()
{
throw new PlatformNotSupportedException(SR.PlatformNotSupported_ThreadAbort);
}
[Obsolete("Thread.Suspend has been deprecated. Please use other classes in System.Threading, such as Monitor, Mutex, Event, and Semaphore, to synchronize Threads or protect resources. https://go.microsoft.com/fwlink/?linkid=14202", false)]
public void Suspend()
{
throw new PlatformNotSupportedException(SR.PlatformNotSupported_ThreadSuspend);
}
[Obsolete("Thread.Resume has been deprecated. Please use other classes in System.Threading, such as Monitor, Mutex, Event, and Semaphore, to synchronize Threads or protect resources. https://go.microsoft.com/fwlink/?linkid=14202", false)]
public void Resume()
{
throw new PlatformNotSupportedException(SR.PlatformNotSupported_ThreadSuspend);
}
Help will always be given at Hogwarts to those who ask for it.
Здравствуйте, _FRED_, Вы писали:
_FR>Здравствуйте, fdn721, Вы писали:
MA>>>Без Thread.Abort они теряют практический смысл.
F>>А использование Thread.Abort — это пример эталонного гавнокода.
_FR>И не напоминайте
У вас есть код, которому нужен именно Thread.Abort и нет возможности переписать с использованием CancellationToken или другого аналога ?
Всегда есть хардкор вариант DllImport TerminateThread, но зачем
Здравствуйте, _NN_, Вы писали:
MA>>>>Без Thread.Abort они теряют практический смысл. F>>>А использование Thread.Abort — это пример эталонного гавнокода. _FR>>И не напоминайте _NN>У вас есть код, которому нужен именно Thread.Abort и нет возможности переписать с использованием CancellationToken или другого аналога ?
Наоборот, я видел код с Thread::Abort() и предлагал исправить, но слышал в ответ, что раз такой метод есть, то странно им не пользоваться, тем более с ним всё так удобно.
И никакие отсылки к рекомендациям по [не-]использованию этого метода на собеседников не действовали.
Help will always be given at Hogwarts to those who ask for it.
Здравствуйте, _FRED_, Вы писали:
_FR>Наоборот, я видел код с Thread::Abort() и предлагал исправить, но слышал в ответ, что раз такой метод есть, то странно им не пользоваться, тем более с ним всё так удобно. _FR>И никакие отсылки к рекомендациям по [не-]использованию этого метода на собеседников не действовали.
Подозреваю следующим этапом будут отмазки в стиле в .NET 5.0 нет Thread.Abort не будем на него переходить
Здравствуйте, _NN_, Вы писали:
_FR>>И не напоминайте _NN>У вас есть код, которому нужен именно Thread.Abort и нет возможности переписать с использованием CancellationToken или другого аналога ? _NN>Всегда есть хардкор вариант DllImport TerminateThread, но зачем
Для примера есть системный код который зависает по неизвестным причинам. При этом нет никакого async и CancellationToken. Можно по истечении времени кинуть Thread.Abort отловить его и сделать Thread.ResetAbort
Во всяком случае можно дальше работать или отвиснуть поток, что бы не копились
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, Serginio1, Вы писали:
S>Для примера есть системный код который зависает по неизвестным причинам. При этом нет никакого async и CancellationToken. Можно по истечении времени кинуть Thread.Abort отловить его и сделать Thread.ResetAbort S>Во всяком случае можно дальше работать или отвиснуть поток, что бы не копились
Если "системный код" — это неуправляемый код, то Thread.Abort тут ничем не поможет, т.к. Thread.Abort реализован средствами CLR (соотв. никак не связан с TerminateThread) — проставляется спец. флаг что требуется Abort, который в определенных, хз каких, местах исполняемого кода проверяется, известно только где не проверяется (catch, finnaly, CER, неуправляемый код, может где еще). По этому флагу и генерится исключение ThreadAbortException, который можно перехватить и да, сбросить его (ResetAbort).
Здравствуйте, 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 работает и в основном потоке. Практика!
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, Serginio1, Вы писали:
_>>Если "системный код" — это неуправляемый код, то Thread.Abort тут ничем не поможет, т.к. Thread.Abort реализован средствами CLR (соотв. никак не связан с TerminateThread) — проставляется спец. флаг что требуется Abort, который в определенных, хз каких, местах исполняемого кода проверяется, известно только где не проверяется (catch, finnaly, CER, неуправляемый код, может где еще). По этому флагу и генерится исключение ThreadAbortException, который можно перехватить и да, сбросить его (ResetAbort).
S> Как это не поможет. Есть два пути
Выделил для тебя
S>1. В основном коде вызываем в try catch и запускаем наблюдающий поток и если завис бросаем Thread.Abort S>2. Запускаем отдельный поток в котором в блоке try catch вызывается проблемная функция и через таймаут бросаем Thread.Abort.
S> Реально Thread.Abort в связке Thread.ResetAbort работает и в основном потоке. Практика!
Путано излагаешь, неважно откуда был вызван Thread.Abort, важно что прервать Abort можно только в прерываемом потоке с пом. перехвата ThreadAbortException и вызова Thread.ResetAbort.
Здравствуйте, pilgrim_, Вы писали:
_>Здравствуйте, Serginio1, Вы писали:
_>>>Если "системный код" — это неуправляемый код, то Thread.Abort тут ничем не поможет, т.к. Thread.Abort реализован средствами CLR (соотв. никак не связан с TerminateThread) — проставляется спец. флаг что требуется Abort, который в определенных, хз каких, местах исполняемого кода проверяется, известно только где не проверяется (catch, finnaly, CER, неуправляемый код, может где еще). По этому флагу и генерится исключение ThreadAbortException, который можно перехватить и да, сбросить его (ResetAbort).
S>> Как это не поможет. Есть два пути
_>Выделил для тебя
Из практики например системный код это COM привязанный к основному потоку приложения. И наверняка не управляемый.
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, Serginio1, Вы писали:
S>Здравствуйте, _NN_, Вы писали:
_FR>>>И не напоминайте _NN>>У вас есть код, которому нужен именно Thread.Abort и нет возможности переписать с использованием CancellationToken или другого аналога ? _NN>>Всегда есть хардкор вариант DllImport TerminateThread, но зачем
S>Для примера есть системный код который зависает по неизвестным причинам. При этом нет никакого async и CancellationToken. Можно по истечении времени кинуть Thread.Abort отловить его и сделать Thread.ResetAbort S>Во всяком случае можно дальше работать или отвиснуть поток, что бы не копились
Это не поможет разве что управление потом возвращается в управляемый код, а там уже и CancellationToken можно поставить.
If Abort is called on a managed thread while it is executing unmanaged code, a ThreadAbortException is not thrown until the thread returns to managed code.
Здравствуйте, _NN_, Вы писали:
_NN>Здравствуйте, Serginio1, Вы писали:
S>>Здравствуйте, _NN_, Вы писали:
_FR>>>>И не напоминайте _NN>>>У вас есть код, которому нужен именно Thread.Abort и нет возможности переписать с использованием CancellationToken или другого аналога ? _NN>>>Всегда есть хардкор вариант DllImport TerminateThread, но зачем
S>>Для примера есть системный код который зависает по неизвестным причинам. При этом нет никакого async и CancellationToken. Можно по истечении времени кинуть Thread.Abort отловить его и сделать Thread.ResetAbort S>>Во всяком случае можно дальше работать или отвиснуть поток, что бы не копились
_NN>Это не поможет разве что управление потом возвращается в управляемый код, а там уже и CancellationToken можно поставить. _NN>
_NN>If Abort is called on a managed thread while it is executing unmanaged code, a ThreadAbortException is not thrown until the thread returns to managed code.
Управление всеми потоками осуществляется посредством класса Thread , включая потоки, созданные средой CLR или созданные за пределами среды выполнения и входящие в управляемую среду для выполнения кода. Среда выполнения отслеживает в своем процессе все потоки, которые когда-либо выполняли код в управляемой среде. Другие потоки она не отслеживает. Потоки могут входить в управляемую среду выполнения посредством COM-взаимодействия (так как среда выполнения предоставляет управляемые объекты неуправляемой среде в качестве COM-объектов), функции COM DllGetClassObject и вызова неуправляемого кода.
Когда неуправляемый поток входит в среду выполнения, например, посредством вызываемой оболочки COM, система проверяет локальное хранилище потока данного потока для поиска внутреннего управляемого объекта Thread . Если он найден, среда выполнения уже оповещена об этом потоке. Если найти объект не удается, среда выполнения создает новый объект Thread и устанавливает его в локальном хранилище потока данного потока.
В следующей таблице элементы потоков Win32 сопоставляются со своими ближайшими аналогами из среды выполнения. Обратите внимание, что такое сопоставление не означает идентичную функциональность. Например, TerminateThread не выполняет предложения finally , не освобождает ресурсы и не может быть запрещен. Однако Thread.Abort выполняет весь ваш код отката, освобождает все ресурсы и может быть отменен с помощью ResetAbort. Прежде чем делать предположения о функциональности, тщательно изучите документацию.
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, Serginio1, Вы писали:
_NN>>Это не поможет разве что управление потом возвращается в управляемый код, а там уже и CancellationToken можно поставить. _NN>>
_NN>>If Abort is called on a managed thread while it is executing unmanaged code, a ThreadAbortException is not thrown until the thread returns to managed code.
_>Тов. Сергей, каким образом во вашему мнению неуправляемый код может узнать что был вызван какой-то там "Thread.Abort"?
Неуправляемый не знает, но Thread.Abort прерывает работу потока и вызывает ThreadAbortException
Что там внутри честно не знаю, но это факт.
Мне просто нужно прервать выполнение зависшей неуправляемой функцию по таймауту
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, Serginio1, Вы писали:
S>Здравствуйте, pilgrim_, Вы писали:
_>>Тов. Сергей, каким образом во вашему мнению неуправляемый код может узнать что был вызван какой-то там "Thread.Abort"? S> Неуправляемый не знает, но Thread.Abort прерывает работу потока и вызывает ThreadAbortException S>Что там внутри честно не знаю, но это факт. S> Мне просто нужно прервать выполнение зависшей неуправляемой функцию по таймауту
Ну вот и подумай, остановить ты можешь только managed поток, поставь там проверку на cancellationtoken и все дальше будет работать. Я интуитивно никогда Thread.Abort не пользовался. Это тот случай когда нужно пару раз подумать нужны ли его сайд эффекты из-за того что в свое время поленились поставить проверки.
Здравствуйте, Serginio1, Вы писали: S>Что там внутри честно не знаю, но это факт. S> Мне просто нужно прервать выполнение зависшей неуправляемой функцию по таймауту
Ваш код работает не так, как вы думаете. Точнее, не работает.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
D>Ну вот и подумай, остановить ты можешь только managed поток, поставь там проверку на cancellationtoken и все дальше будет работать. Я интуитивно никогда Thread.Abort не пользовался. Это тот случай когда нужно пару раз подумать нужны ли его сайд эффекты из-за того что в свое время поленились поставить проверки.
Научи. Есть неуправляемая функция в основном UI потоке которая зависает.
cancellationtoken например в .Net 3.5 нет
Здравствуйте, Sinclair, Вы писали:
S>Здравствуйте, Serginio1, Вы писали: S>>Что там внутри честно не знаю, но это факт. S>> Мне просто нужно прервать выполнение зависшей неуправляемой функцию по таймауту S>Ваш код работает не так, как вы думаете. Точнее, не работает.
То есть мой код продолжает работать, вместо того что бы намертво зависнуть.
Ну не получилось выполнить и хрен с ним.
Что неправильно работает?
Код такого плана
Мой код такого плана https://docs.microsoft.com/ru-ru/dotnet/api/system.threading.threadabortexception?view=net-5.0
и солнце б утром не вставало, когда бы не было меня