Как уничтожить поток немедленно в C#?

Я использовал немного PowerShell для автоматизации сценария. В то время как очень хорошо, что среда, кажется, была продумана намного больше, чем оболочки Unix, на практике использование объектов вместо текстовых потоков является намного более неуклюжим, и много средств Unix, которые были разработаны за прошлые 30 лет, все еще отсутствуют.

Cygwin является все еще моей предпочтительной средой сценариев для хостов Windows. Это, конечно, бьет альтернативы с точки зрения добивания цели.

47
задан Right leg 22 May 2017 в 14:05
поделиться

4 ответа

Причина, по которой сложно просто убить поток, состоит в том, что разработчики языка хотят избежать следующей проблемы: ваш поток принимает блокировку, а затем вы ее уничтожаете, прежде чем он сможет ее освободить. Теперь любой, кому нужна эта блокировка, застрянет.

Что вам нужно сделать, так это использовать некоторую глобальную переменную, чтобы сказать потоку остановиться. Вам необходимо вручную в коде потока проверить эту глобальную переменную и вернуть ее, если вы видите, что это означает, что вам следует остановиться.

68
ответ дан 26 November 2019 в 19:20
поделиться

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

8
ответ дан 26 November 2019 в 19:20
поделиться

Сначала у вас должен быть согласованный метод завершения цепочки. Например, running_valiable, который поток может проверять и соблюдать.

Ваш основной код потока должен быть заключен в блок исключения, который перехватывает как ThreadInterruptException, так и ThreadAbortException, который будет аккуратно приводить в порядок поток при выходе.

В случае ThreadInterruptException вы можете проверить переменную running_, чтобы узнать, следует ли продолжить . В случае ThreadAbortException вы должны немедленно привести в порядок и выйти из процедуры потока.

Код, который пытается остановить поток, должен делать следующее:

running_ = false;
threadInstance_.Interrupt();
if(!threadInstance_.Join(2000)) { // or an agreed resonable time
   threadInstance_.Abort();
}
20
ответ дан 26 November 2019 в 19:20
поделиться

C # Thread. При прерывании НЕ гарантируется немедленное прерывание потока. Вероятно, это сработает, когда поток вызывает Abort для себя, но не когда поток вызывает другой.

См. Документацию: http://msdn.microsoft.com/en-us/library/ty8d3wta.aspx

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

aspx

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

aspx

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

5
ответ дан 26 November 2019 в 19:20
поделиться
Другие вопросы по тегам:

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