@SergeySerge11

Как прервать поток c#?

Не могу найти подходящих примеров.

Есть код, который выполняет долгие вычисления, решил отправить в отдельный поток, потом захотелось сделать так что бы по действию пользователя, он прерывался. Раньше и всегда я делал, кучу говнокода, вставлял проверки на статус токена или булевой переменной.
for(int a=0;a<n;a++){
               if(cancellationToken.IsCancellationRequested) { 
                  Dispose();
                 return;
               }
                for(int b=0;b<m;b++){
                      for(int c=0;c<k;c++){
                             for(int d=0;d<l;d++){
                                int[a][b][c][d]=Math.Pow(a*b*c*d,Math.Sqrt(Math.Sin(Math.Cos(Math.Sqrt(a-b/a)))))))*a+b;
                      }
}                }
}

Допустим какой-то такой пример. Но тут еще пример удачный. А что если код размазан, на кучу функций, с кучей размотанных линейных циклов последовательно, в общем 200 строчек кода, то таких проверок штук 10 ставить придется, не красиво. Это вообще правильно? Может есть другие подходы.
Или допустим. Поток вызывает 1 функцию библиотечную неуправляемого кода, как ее прервать?
Какие есть способы.

Например с ходу придумал, можно кодогенераций размазать проверки. По идеи такое должно быть, может библиотека или объект какой-то, типа на вход поступает функция метода, и функция проверки, которую кодогенератор там всунет куда надо.
  • Вопрос задан
  • 269 просмотров
Решения вопроса 1
Это вообще правильно?

Да, это правильно и это по сути единственный адекватный способ отмены долгоиграющих операций.
Когда-то давно у потоков был метод Abort, но его удалили, тк его использование очень часто приводило к неприятным багам.
Ну и пихать проверку cancellation token повсюду не обязательно.
Поток вызывает 1 функцию библиотечную неуправляемого кода, как ее прервать?

Безопасно - никак, если эта неуправляемая функция не предоставляет интерфейс для отмены.
Даже если бы и был способ (тот же Abort), то прерывание неуправляемого кода очень вероятно приведёт к утечке ресурсов (в лучшем случае не будет освобождена динамическая память)
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
mayton2019
@mayton2019
Bigdata Engineer
Раньше и всегда я делал, кучу говнокода, вставлял проверки на статус токена или булевой переменной.

Да. Ты правильно делал. Это единственный дешевый пособ остановить поток не разрушив приложение.
Единственное но. Если это численный метод и он вычисляет
int[a][b][c][d]=Math.Pow(a*b*c*d,Math.Sqrt(Math.Sin(Math.Cos(Math.Sqrt(a-b/a)))))))*a+b;

примерно сто тысяч раз в секунду (ты можешь уточнить), то любой барьер синхронизации
замедлит работу этого кода в тысячи раз. И чтоб не было такого сильного замедления - можно
делать проверку на уровне внешнего цикла.

Практика показывает что частота 10-50 Гц является оптимальной для работы с пользователем.
И нет смысла делать чаще. Ты все равно быстрее на кнопку не нажмешь.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы