Как убить поток мгновенно в С#?
Я использую метод thread.Abort
, чтобы убить поток, но он не работает. Есть ли другой способ завершения потока?
private void button1_Click(object sender, EventArgs e)
{
if (Receiver.IsAlive == true)
{
MessageBox.Show("Alive");
Receiver.Abort();
}
else
{
MessageBox.Show("Dead");
Receiver.Start();
}
}
Я использую это, но каждый раз, когда я получаю статус Alive
, Receiver
- это мой глобальный поток.
Ответы
Ответ 1
Причина, по которой трудно просто убить поток, состоит в том, что разработчики языка хотят избежать следующей проблемы: ваш поток занимает блокировку, а затем вы убиваете ее, прежде чем она сможет ее освободить. Теперь любой, кто нуждается в этом замке, застрянет.
Что вам нужно сделать, так это использовать некоторую глобальную переменную, чтобы остановить поток. Вы должны вручную, в своем коде потока, проверить, что глобальная переменная и вернуть, если вы видите, это означает, что вы должны остановиться.
Ответ 2
Вы можете немедленно убить это:
private Thread _myThread = new Thread(SomeThreadMethod);
private void SomeThreadMethod()
{
// do whatever you want
}
[SecurityPermissionAttribute(SecurityAction.Demand, ControlThread = true)]
private void KillTheThread()
{
_myThread.Abort();
}
Я всегда использую его и работаю для меня:)
Ответ 3
Сначала вы должны иметь согласованный метод окончания потока. Например, бегущий_ валидный, который поток может проверить и выполнить.
Ваш основной код потока должен быть обернут в блок исключений, который поймает как ThreadInterruptException, так и ThreadAbortException, которые очистят поток при выходе.
В случае ThreadInterruptException вы можете проверить переменную running_, чтобы увидеть, следует ли продолжить. В случае ThreadAbortException вы должны немедленно привести в порядок и выйти из процедуры потока.
Код, который пытается остановить поток, должен сделать следующее:
running_ = false;
threadInstance_.Interrupt();
if(!threadInstance_.Join(2000)) { // or an agreed resonable time
threadInstance_.Abort();
}
Ответ 4
поток будет убит, когда он завершит его работу, поэтому, если вы используете циклы или что-то еще, вы должны передать переменную в поток, чтобы остановить цикл, после чего поток будет завершен.
Ответ 5
С# Thread.Abort НЕ гарантируется мгновенное прерывание потока. Вероятно, он работает, когда поток вызывает Abort сам по себе, но не тогда, когда поток вызывает другой.
Пожалуйста, обратитесь к документации: http://msdn.microsoft.com/en-us/library/ty8d3wta.aspx
Я столкнулся с этой проблемой при написании инструментов, которые взаимодействуют с аппаратными средствами - вам нужна немедленная остановка, но она не гарантируется. Обычно я использую некоторые флаги или другую такую логику, чтобы предотвратить выполнение частей кода, выполняющихся в потоке (и которые я не хочу выполнять с ошибкой).
Ответ 6
private void ResumeButton_Click(object sender, RoutedEventArgs e)
{
Task.Factory.StartNew(() =>
{
Application.Current.Resources["AutoPilotThreadStatus"] = true;
Thread.CurrentThread.Name = "ResumeAutoPilot";
Thread.CurrentThread.IsBackground = true;
AutoPilotHandler.ResumeAutoPilot();
});
}
public static void ResumeAutoPilot()
{
while ((bool)Application.Current.Resources["AutoPilotThreadStatus"])
{
CheckAutoPilotThreadStatus();
var searchYoutube = YoutubeHandler.Search("small truck");
CheckAutoPilotThreadStatus();
SaveVideosToDatabase(searchYoutube);
CheckAutoPilotThreadStatus();
}
}
public static void CheckAutoPilotThreadStatus()
{
if (!(bool)Application.Current.Resources["AutoPilotThreadStatus"])
{
KillCurrentThread();
}
}
public static void KillCurrentThread()
{
Thread.CurrentThread.Abort();
}