Как использовать thread.abort()
Вы не используете Thread.Abort()
, никогда, если только вы не выполняете аварийное завершение всего домена приложения или процесса. Вы НИКОГДА ЭТОГО НЕ ДЕЛАЕТЕ. Я надеюсь, что это очень ясно.
Вот несколько причин, по которым вы никогда этого не сделаете:
- Есть много лучших способов контролировать отмену асинхронного рабочего процесса, чем его прерывание.
- Прерывание потока не гарантирует фактического прерывания потока. Поток, который активно сопротивляется прерыванию, имеет способы отложить прерывание на неопределенное время. Это ненадежно, поэтому не используйте его.
- Самое главное: прерывание потока гарантирует сохранение правильности внутренних механизмов, используемых CLR для управления потоком. Не гарантируется правильность вашей программы! Прерывание потока может привести к нарушению инвариантов вашей программы интересным образом, что часто приводит к сбоям. (Упражнение: перечислите возможные последствия прерывания потока во время создания объекта с помощью финализатора)
Правильный способ структурировать программу — использовать шаблон совместной отмены и представлять асинхронную работу как задачу, которую можно отменить. Затем асинхронная работа периодически опрашивает токен, чтобы узнать, нужно ли его отменить.
Более того: если асинхронная работа не привязана к процессору, правильным решением будет не использовать рабочий поток. Вместо этого используйте асинхронный ввод-вывод и await
результат. Вы бы не наняли работника, чтобы он стоял у вашего почтового ящика и сообщал вам, когда приходят письма; Точно так же не нанимайте работника, чтобы он стоял и ждал завершения задачи ввода-вывода. Сохраняйте асинхронную работу в основном потоке, если он не привязан к процессору, и ваш поток будет продолжать обслуживать запросы пользователей, пока он ожидает.
У меня ошибка a field initializer can not reference a non static field, method or property.
Это правильно. Инициализатор поля не может использовать this
каким-либо образом, включая неявное использование внутри тела лямбды. Причина этого в том, что инициализатор поля запускается до запуска тела конструктора, но именно тело конструктора инициализирует поля this
. Дизайн языка пытается уберечь вас от написания здесь неприятной ошибки.
Вам нужно переместить логику инициализации в конструктор.
Но в более общем плане, если требования вашей программы заключаются в том, что вы должны асинхронно выполнять связанные с вводом-выводом задачи с высокой задержкой, которые могут быть отменены пользователем, то вы выбрали неправильные механизмы для правильного и безопасного достижения этой цели.
Я близок к концу проекта, поэтому я не хочу вносить много изменений.
Я уверен, что нет. Чем раньше вы начнете исправлять свои архитектурные проблемы, тем скорее вы получите правильную и безопасную реализацию.
у меня крайний срок
Это проблема управления, а не техническая. Мой совет: объясните ситуацию своему руководству. Они заслуживают того, чтобы знать, что выбор состоит в том, чтобы уложиться в срок с неправильно структурированной и, возможно, нестабильной программой, или продлить срок и реструктурировать программу в принципиальную, правильную, безопасную программу, отвечающую требованиям пользователя. Менеджмент должен иметь право принимать информированное решение о состоянии проекта, за который они вам платят.
person
Eric Lippert
schedule
19.12.2019
CancellationTokenSource
иCancellationToken
для отмены длительных фоновых процессов вместо Thread.Abort. Вы не должны использовать Thread.Abort, если вы не готовы впоследствии разорвать свой процесс. Thread.Abort немного безопаснее, чем раньше, но его по-прежнему небезопасно использовать, если вы точно не знаете, что делаете. - person Lasse V. Karlsen   schedule 19.12.2019List<Task>
с использованиемCancellationTokenSource
, чтобы вы могли просто передатьCancellationToken
Задаче(ям)? Вы можете дождаться одной задачи или использоватьawait Task.WhenAll()
вместо использования BackgroundWorker таким образом. - person Jimi   schedule 19.12.2019Thread.Abort
совсем не изящный. - person   schedule 19.12.2019worker.CancelAsync()
. См. пример здесь: wpf-tutorial.com/misc/cancelling-the -фоновый работник - person Robert Harvey   schedule 19.12.2019Thread.Abort()
— плохая идея. Мы говорим вам это по очень веским причинам. - person   schedule 19.12.2019=
в метод. - person Lasse V. Karlsen   schedule 19.12.2019Thread.Abort()
, если только нет абсолютно невозможного способа завершить поток любым другим способом. Учитесь на наших ошибках: не используйтеThread.Abort
. docs.microsoft.com/ en-us/dotnet/api/ - person Jim Mischel   schedule 19.12.2019