.NET5 и CER
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 18.11.20 17:13
Оценка:
Изменения в связанных проектах заставили обновить платформу проекта до net5.0

Вылезло такое предупреждение:

warning SYSLIB0004: 'RuntimeHelpers.PrepareConstrainedRegions()' is obsolete: 'The Constrained Execution Region (CER) feature is not supported.'


У меня пара (риторических) вопросов:

1. Пришло время от него избавляться?

2. А что они взамен предлагают?

Я этот CER юзал для неуправляемых ресурсов и участков кода, которые обязательно должны выполниться (для сохранения целостности состояния).
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re: .NET5 и CER
От: Mystic Artifact  
Дата: 18.11.20 18:01
Оценка: 9 (2)
Здравствуйте, Коваленко Дмитрий, Вы писали:

Без Thread.Abort они теряют практический смысл.
Re[2]: .NET5 и CER
От: fdn721  
Дата: 19.11.20 04:29
Оценка: +1
Здравствуйте, Mystic Artifact, Вы писали:

MA>Здравствуйте, Коваленко Дмитрий, Вы писали:


MA>Без Thread.Abort они теряют практический смысл.


А использование Thread.Abort — это пример эталонного гавнокода.
Re[3]: .NET5 и CER
От: _FRED_ Черногория
Дата: 19.11.20 15:37
Оценка:
Здравствуйте, fdn721, Вы писали:

MA>>Без Thread.Abort они теряют практический смысл.


F>А использование Thread.Abort — это пример эталонного гавнокода.


И не напоминайте

https://docs.microsoft.com/en-us/dotnet/core/compatibility/syslib0006

https://github.com/dotnet/runtime/blob/master/src/libraries/System.Private.CoreLib/src/System/Threading/Thread.cs#L245

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.
Re[4]: .NET5 и CER
От: _NN_ www.nemerleweb.com
Дата: 19.11.20 22:24
Оценка:
Здравствуйте, _FRED_, Вы писали:

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


MA>>>Без Thread.Abort они теряют практический смысл.


F>>А использование Thread.Abort — это пример эталонного гавнокода.


_FR>И не напоминайте

У вас есть код, которому нужен именно Thread.Abort и нет возможности переписать с использованием CancellationToken или другого аналога ?
Всегда есть хардкор вариант DllImport TerminateThread, но зачем
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[5]: .NET5 и CER
От: _FRED_ Черногория
Дата: 20.11.20 11:52
Оценка: :)
Здравствуйте, _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.
Re[6]: .NET5 и CER
От: _NN_ www.nemerleweb.com
Дата: 20.11.20 12:07
Оценка: +1
Здравствуйте, _FRED_, Вы писали:

_FR>Наоборот, я видел код с Thread::Abort() и предлагал исправить, но слышал в ответ, что раз такой метод есть, то странно им не пользоваться, тем более с ним всё так удобно.

_FR>И никакие отсылки к рекомендациям по [не-]использованию этого метода на собеседников не действовали.

Подозреваю следующим этапом будут отмазки в стиле в .NET 5.0 нет Thread.Abort не будем на него переходить
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[5]: .NET5 и CER
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 20.11.20 15:23
Оценка:
Здравствуйте, _NN_, Вы писали:

_FR>>И не напоминайте

_NN>У вас есть код, которому нужен именно Thread.Abort и нет возможности переписать с использованием CancellationToken или другого аналога ?
_NN>Всегда есть хардкор вариант DllImport TerminateThread, но зачем

Для примера есть системный код который зависает по неизвестным причинам. При этом нет никакого async и CancellationToken. Можно по истечении времени кинуть Thread.Abort отловить его и сделать Thread.ResetAbort
Во всяком случае можно дальше работать или отвиснуть поток, что бы не копились
и солнце б утром не вставало, когда бы не было меня
Re[6]: .NET5 и CER
От: pilgrim_ Россия  
Дата: 20.11.20 16:00
Оценка:
Здравствуйте, Serginio1, Вы писали:

S>Для примера есть системный код который зависает по неизвестным причинам. При этом нет никакого async и CancellationToken. Можно по истечении времени кинуть Thread.Abort отловить его и сделать Thread.ResetAbort

S>Во всяком случае можно дальше работать или отвиснуть поток, что бы не копились

Если "системный код" — это неуправляемый код, то Thread.Abort тут ничем не поможет, т.к. Thread.Abort реализован средствами CLR (соотв. никак не связан с TerminateThread) — проставляется спец. флаг что требуется Abort, который в определенных, хз каких, местах исполняемого кода проверяется, известно только где не проверяется (catch, finnaly, CER, неуправляемый код, может где еще). По этому флагу и генерится исключение ThreadAbortException, который можно перехватить и да, сбросить его (ResetAbort).
Re[7]: .NET5 и CER
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 20.11.20 16:36
Оценка: :)
Здравствуйте, 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 работает и в основном потоке. Практика!
и солнце б утром не вставало, когда бы не было меня
Re[8]: .NET5 и CER
От: pilgrim_ Россия  
Дата: 20.11.20 17:11
Оценка:
Здравствуйте, 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.
Re[9]: .NET5 и CER
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 20.11.20 17:59
Оценка: :))
Здравствуйте, pilgrim_, Вы писали:

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


_>>>Если "системный код" — это неуправляемый код, то Thread.Abort тут ничем не поможет, т.к. Thread.Abort реализован средствами CLR (соотв. никак не связан с TerminateThread) — проставляется спец. флаг что требуется Abort, который в определенных, хз каких, местах исполняемого кода проверяется, известно только где не проверяется (catch, finnaly, CER, неуправляемый код, может где еще). По этому флагу и генерится исключение ThreadAbortException, который можно перехватить и да, сбросить его (ResetAbort).


S>> Как это не поможет. Есть два пути


_>Выделил для тебя


Из практики например системный код это COM привязанный к основному потоку приложения. И наверняка не управляемый.
и солнце б утром не вставало, когда бы не было меня
Отредактировано 20.11.2020 18:00 Serginio1 . Предыдущая версия .
Re[6]: .NET5 и CER
От: _NN_ www.nemerleweb.com
Дата: 21.11.20 05:58
Оценка:
Здравствуйте, 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.


https://docs.microsoft.com/en-us/dotnet/api/system.threading.thread.abort?redirectedfrom=MSDN&view=net-5.0#System_Threading_Thread_Abort
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[7]: .NET5 и CER
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 21.11.20 15:00
Оценка:
Здравствуйте, _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.


_NN>https://docs.microsoft.com/en-us/dotnet/api/system.threading.thread.abort?redirectedfrom=MSDN&view=net-5.0#System_Threading_Thread_Abort


В потоке который создан CLR прекрасно работают реально бросаю Thread.Abort перехватываю ThreadAbortException и вызываю ResetAbort
https://docs.microsoft.com/ru-ru/dotnet/standard/threading/managed-and-unmanaged-threading-in-windows

Управление всеми потоками осуществляется посредством класса Thread , включая потоки, созданные средой CLR или созданные за пределами среды выполнения и входящие в управляемую среду для выполнения кода. Среда выполнения отслеживает в своем процессе все потоки, которые когда-либо выполняли код в управляемой среде. Другие потоки она не отслеживает. Потоки могут входить в управляемую среду выполнения посредством COM-взаимодействия (так как среда выполнения предоставляет управляемые объекты неуправляемой среде в качестве COM-объектов), функции COM DllGetClassObject и вызова неуправляемого кода.
Когда неуправляемый поток входит в среду выполнения, например, посредством вызываемой оболочки COM, система проверяет локальное хранилище потока данного потока для поиска внутреннего управляемого объекта Thread . Если он найден, среда выполнения уже оповещена об этом потоке. Если найти объект не удается, среда выполнения создает новый объект Thread и устанавливает его в локальном хранилище потока данного потока.



В следующей таблице элементы потоков Win32 сопоставляются со своими ближайшими аналогами из среды выполнения. Обратите внимание, что такое сопоставление не означает идентичную функциональность. Например, TerminateThread не выполняет предложения finally , не освобождает ресурсы и не может быть запрещен. Однако Thread.Abort выполняет весь ваш код отката, освобождает все ресурсы и может быть отменен с помощью ResetAbort. Прежде чем делать предположения о функциональности, тщательно изучите документацию.

и солнце б утром не вставало, когда бы не было меня
Re[8]: .NET5 и CER
От: pilgrim_ Россия  
Дата: 21.11.20 21:38
Оценка:
Здравствуйте, 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.


_NN>>https://docs.microsoft.com/en-us/dotnet/api/system.threading.thread.abort?redirectedfrom=MSDN&view=net-5.0#System_Threading_Thread_Abort


S> В потоке который создан CLR прекрасно работают реально бросаю Thread.Abort перехватываю ThreadAbortException и вызываю ResetAbort


Тов. Сергей, каким образом во вашему мнению неуправляемый код может узнать что был вызван какой-то там "Thread.Abort"?
Re[9]: .NET5 и CER
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 22.11.20 08:57
Оценка: :)
Здравствуйте, pilgrim_, Вы писали:


_>Тов. Сергей, каким образом во вашему мнению неуправляемый код может узнать что был вызван какой-то там "Thread.Abort"?

Неуправляемый не знает, но Thread.Abort прерывает работу потока и вызывает ThreadAbortException
Что там внутри честно не знаю, но это факт.
Мне просто нужно прервать выполнение зависшей неуправляемой функцию по таймауту
и солнце б утром не вставало, когда бы не было меня
Отредактировано 22.11.2020 9:07 Serginio1 . Предыдущая версия . Еще …
Отредактировано 22.11.2020 9:06 Serginio1 . Предыдущая версия .
Re[10]: .NET5 и CER
От: Danchik Украина  
Дата: 23.11.20 11:23
Оценка:
Здравствуйте, Serginio1, Вы писали:

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



_>>Тов. Сергей, каким образом во вашему мнению неуправляемый код может узнать что был вызван какой-то там "Thread.Abort"?

S> Неуправляемый не знает, но Thread.Abort прерывает работу потока и вызывает ThreadAbortException
S>Что там внутри честно не знаю, но это факт.
S> Мне просто нужно прервать выполнение зависшей неуправляемой функцию по таймауту

Ну вот и подумай, остановить ты можешь только managed поток, поставь там проверку на cancellationtoken и все дальше будет работать. Я интуитивно никогда Thread.Abort не пользовался. Это тот случай когда нужно пару раз подумать нужны ли его сайд эффекты из-за того что в свое время поленились поставить проверки.
Re[10]: .NET5 и CER
От: Sinclair Россия https://github.com/evilguest/
Дата: 23.11.20 13:22
Оценка:
Здравствуйте, Serginio1, Вы писали:
S>Что там внутри честно не знаю, но это факт.
S> Мне просто нужно прервать выполнение зависшей неуправляемой функцию по таймауту
Ваш код работает не так, как вы думаете. Точнее, не работает.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[11]: .NET5 и CER
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 23.11.20 14:13
Оценка:
Здравствуйте, Danchik, Вы писали:


D>Ну вот и подумай, остановить ты можешь только managed поток, поставь там проверку на cancellationtoken и все дальше будет работать. Я интуитивно никогда Thread.Abort не пользовался. Это тот случай когда нужно пару раз подумать нужны ли его сайд эффекты из-за того что в свое время поленились поставить проверки.


Научи. Есть неуправляемая функция в основном UI потоке которая зависает.
cancellationtoken например в .Net 3.5 нет

Покажи код. Буду благодарен

Мой код такого плана https://docs.microsoft.com/ru-ru/dotnet/api/system.threading.threadabortexception?view=net-5.0
и солнце б утром не вставало, когда бы не было меня
Отредактировано 23.11.2020 14:18 Serginio1 . Предыдущая версия .
Re[11]: .NET5 и CER
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 23.11.20 14:14
Оценка:
Здравствуйте, Sinclair, Вы писали:

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

S>>Что там внутри честно не знаю, но это факт.
S>> Мне просто нужно прервать выполнение зависшей неуправляемой функцию по таймауту
S>Ваш код работает не так, как вы думаете. Точнее, не работает.
То есть мой код продолжает работать, вместо того что бы намертво зависнуть.
Ну не получилось выполнить и хрен с ним.
Что неправильно работает?
Код такого плана
Мой код такого плана https://docs.microsoft.com/ru-ru/dotnet/api/system.threading.threadabortexception?view=net-5.0
и солнце б утром не вставало, когда бы не было меня
Отредактировано 23.11.2020 14:18 Serginio1 . Предыдущая версия .
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.