Как убить поток мгновенно в С#?

Я использую метод 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();
    }