Здравствуйте, Serginio1, Вы писали:
S>Здравствуйте, Danchik, Вы писали:
D>>Ну вот и подумай, остановить ты можешь только managed поток, поставь там проверку на cancellationtoken и все дальше будет работать. Я интуитивно никогда Thread.Abort не пользовался. Это тот случай когда нужно пару раз подумать нужны ли его сайд эффекты из-за того что в свое время поленились поставить проверки.
S>Научи. Есть неуправляемая функция в основном UI потоке которая зависает. S>cancellationtoken например в .Net 3.5 нет
Здравствуйте, Serginio1, Вы писали:
S>Здравствуйте, Danchik, Вы писали:
D>>Ну вот и подумай, остановить ты можешь только managed поток, поставь там проверку на cancellationtoken и все дальше будет работать. Я интуитивно никогда Thread.Abort не пользовался. Это тот случай когда нужно пару раз подумать нужны ли его сайд эффекты из-за того что в свое время поленились поставить проверки.
S>Научи. Есть неуправляемая функция в основном UI потоке которая зависает. S>cancellationtoken например в .Net 3.5 нет
Опять же у вас неуправляемая функция. Thread.Abort в неуправляемой функции не вызовится никогда, .NET не знает на чем там сейчас крутится функция, может на диск пишет или память освобождает. Он сработает как только когды вы из нее выйдете и попадете в управляемую среду — нафига тогда этот Abort?
Здравствуйте, _NN_, Вы писали:
_NN>Здравствуйте, Serginio1, Вы писали:
S>>Здравствуйте, Danchik, Вы писали:
D>>>Ну вот и подумай, остановить ты можешь только managed поток, поставь там проверку на cancellationtoken и все дальше будет работать. Я интуитивно никогда Thread.Abort не пользовался. Это тот случай когда нужно пару раз подумать нужны ли его сайд эффекты из-за того что в свое время поленились поставить проверки.
S>>Научи. Есть неуправляемая функция в основном UI потоке которая зависает. S>>cancellationtoken например в .Net 3.5 нет
_NN>Можете не благодарить https://www.nuget.org/packages/TaskParallelLibrary/
Спасибо! _NN>Другой вопрос почему мы говорим о .NET 3.5 когда есть .NET Core , который прекрасно работает на Windows 7.
Например xp еще есть у клиентов. Ну опять же куда мне cancellationtoken прикрутить к основному потоку?
И где мне вызвать Cancel(); если функция зависла?
Мне бы примерчик, как прервать неуправляемую функцию которая привязана к UI потоку?
и солнце б утром не вставало, когда бы не было меня
S>> Покажи код. Буду благодарен
S>>Мой код такого плана https://docs.microsoft.com/ru-ru/dotnet/api/system.threading.threadabortexception?view=net-5.0
D>Опять же у вас неуправляемая функция. Thread.Abort в неуправляемой функции не вызовится никогда, .NET не знает на чем там сейчас крутится функция, может на диск пишет или память освобождает. Он сработает как только когды вы из нее выйдете и попадете в управляемую среду — нафига тогда этот Abort?
А мне не надо перехватывать в неуправляемой функции.
Мне нужно прервать выполнение этой функции в управляемом основном потоке по таймауту.
и солнце б утром не вставало, когда бы не было меня
Везде в примерах нужно опросить CancellationToken на ct.IsCancellationRequested
Либо вызвать CancellationTokenSource Cancel для установи исключения.
Как эти мне снять выполнение зависшей функции.
Я уже у всех прошу решения. Никто так и не показал
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, Serginio1, Вы писали:
S>Везде в примерах нужно опросить CancellationToken на ct.IsCancellationRequested S>Либо вызвать CancellationTokenSource Cancel для установи исключения. S> Как эти мне снять выполнение зависшей функции. S> Я уже у всех прошу решения. Никто так и не показал
Автоматически как в случае с Thread.Abort думаю нет способа.
Надо посмотреть как в .NET Framework реализовано и что происходить в .NET Core в этом же месте.
Самый надёжный вариант это вручную проставлять все места возврата из неуправляемого кода.
Полагаю этого хочется и избежать.
В принципе можно динамически или статически сгенерировать обёртку для COM интерфейса которая будет проверять CancellationToken после каждого вызова и кидать исключение об отмене.
Здравствуйте, Serginio1, Вы писали: S> То есть мой код продолжает работать, вместо того что бы намертво зависнуть. S>Ну не получилось выполнить и хрен с ним. S>Что неправильно работает?
Вы думаете, что прерываете вызов во время неуправляемого кода. А на самом деле нет. То, что ваш код не зависает намертво — случайность. S>Код такого плана S>Мой код такого плана https://docs.microsoft.com/ru-ru/dotnet/api/system.threading.threadabortexception?view=net-5.0
Перепишите его.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
public static void DoWork() {
try {
callUnmagedCode(); // вот этот код зависает причем в основном потоке
}
}
catch(ThreadAbortException e) {
Thread.ResetAbort();
}
}
Тут кода то с гулькин ..
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, Петрухин Эдуард, Вы писали:
ПЭ>Здравствуйте, Serginio1, Вы писали:
S>> Мне бы примерчик, как прервать неуправляемую функцию которая привязана к UI потоку?
ПЭ>Может быть, вот эта статья поможет: Задачи и отмена в .Net — tips & tricks.
Спасибо! Это я все читал давным давно.
Мне примерчик. Сейчас типа такого
public static void DoWork() {
try {
callUnmagedCode(); // вот этот код зависает причем в основном потоке
}
}
catch(ThreadAbortException e) {
Thread.ResetAbort();
}
}
Все смеются надомной, но я то всего навсего прошу пример, как такую ситуацию разрулить причем в основном потоке
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, Serginio1, Вы писали:
S> И как мне с его помощью прервать выполнение неуправляемой функции в основном потоке?
Никак. Ровно как и в случае Thread.Abort.
S> Я уже у всех прошу решения. Никто так и не показал
Дотнет так устроен, что безопасно отменить работу произвольной функции без поддержки этого в самой функции нельзя из-за особенности работы статических конструкторов.
Здравствуйте, Ночной Смотрящий, Вы писали:
НС>Здравствуйте, Serginio1, Вы писали:
S>> И как мне с его помощью прервать выполнение неуправляемой функции в основном потоке?
НС>Никак. Ровно как и в случае Thread.Abort.
S>> Я уже у всех прошу решения. Никто так и не показал
НС>Дотнет так устроен, что безопасно отменить работу произвольной функции без поддержки этого в самой функции нельзя из-за особенности работы статических конструкторов.
Мне не интересно безоапасно. Мне нужно прервать зависшую функцию или перезапустить приложение (если надо сериализовать данные), а не грохать полностью приложение через диспетчер задач
Thread.Abort позволяет это сделать, а вот всякие CancellationToken нет.
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, Serginio1, Вы писали:
НС>>Дотнет так устроен, что безопасно отменить работу произвольной функции без поддержки этого в самой функции нельзя из-за особенности работы статических конструкторов. S> Мне не интересно безоапасно. Мне нужно прервать зависшую функцию
И пофик что остальное приложение сломается?
S> или перезапустить приложение
Ну так перезапускай. Process.Exit никто не отменял.
S>public static void DoWork() {
S> try {
S> callUnmagedCode(); // вот этот код зависает причем в основном потоке
S> }
S> }
S> catch(ThreadAbortException e) {
S> Thread.ResetAbort();
S> }
S> }
S>
S>Тут кода то с гулькин ..
Такие дела делаются внешиними процесами. Стартуется еще один EXE с параметрами, на выход он должен дать результат. Если процес не завершил работу вовремя — прибиваем его. Только так вы не угробите свое рабочее приложение.
Также можно стартануть такой процес как RPC сервер, чтобы не плодить параметров. И рестартовать его когда надо.
Здравствуйте, Ночной Смотрящий, Вы писали:
НС>Здравствуйте, Serginio1, Вы писали:
НС>>>Дотнет так устроен, что безопасно отменить работу произвольной функции без поддержки этого в самой функции нельзя из-за особенности работы статических конструкторов. S>> Мне не интересно безоапасно. Мне нужно прервать зависшую функцию
НС>И пофик что остальное приложение сломается?
Оно не ломается. S>> или перезапустить приложение
НС>Ну так перезапускай. Process.Exit никто не отменял.
А сохранить данные? Память то не ломается. Ломается то, что в блоке try catch
Пересоздам все что нужно.
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, Danchik, Вы писали: S>>Тут кода то с гулькин ..
D>Такие дела делаются внешиними процесами. Стартуется еще один EXE с параметрами, на выход он должен дать результат. Если процес не завершил работу вовремя — прибиваем его. Только так вы не угробите свое рабочее приложение.
D>Также можно стартануть такой процес как RPC сервер, чтобы не плодить параметров. И рестартовать его когда надо.
Значит примера не будет. Ну то есть отдельный процесс плодить. Доменов то в Core тоже нет.
Еще раз ломается то, что находится в try catch. А его легко восстановить.
Да и трудоемко выводить весь код а отдельный процесс, когда куча взаимосвязей. И это проблема возникает раз в пятилетку
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, Ночной Смотрящий, Вы писали:
НС>Здравствуйте, Serginio1, Вы писали:
НС>>>И пофик что остальное приложение сломается? S>> Оно не ломается.
НС>Это вероятностный момент.
Что может сломаться вне блока try catch?
и солнце б утром не вставало, когда бы не было меня