Thread.Abort () не работает, когда в потоке используется AWAIT. C # - PullRequest
0 голосов
/ 16 октября 2019

У меня есть одна кнопка, и когда я нажимаю на нее, я создаю один поток, и через 10 секунд я прерываю его. Когда я снова нажимаю на кнопку, создается новая тема, но проблема в том, что когда я использую AWAIT, эта тема не прерывается. Приложение показывает значение старого потока с вновь созданным потоком. Но когда я не использую AWAIT, он работает нормально. Ниже приведен пример моего Кодекса.

Логика с AWAIT (вы можете видеть на изображении ниже, что старая нить также работает) Click for View Image

try
        {
            var _Thread1 = new Thread(async () =>
            {
                int i = new Random().Next(10, 99);
                while (true)
                {
                    this.BeginInvoke(new Action(() =>
                    {
                        listBox1.Items.Add($"{i}");
                    }));
                    await Task.Delay(3000);
                }
            });
            _Thread1.Start();
            Thread.Sleep(10000);
            _Thread1.Abort();
        }
        catch (Exception ex)
        {
        }

ВЫХОД 48 48 48 48 48 48 83 48 83 48 83 48 83

Логика без ожидания (ниже логика работает файл). Click for View Image

try
        {
            var _Thread1 = new Thread(async () =>
            {
                int i = new Random().Next(10, 99);
                while (true)
                {
                    this.BeginInvoke(new Action(() =>
                    {
                        listBox1.Items.Add($"{i}");
                    }));
                    Thread.Sleep(3000);
                    //await Task.Delay(3000);
                }
            });
            _Thread1.Start();
            Thread.Sleep(10000);
            _Thread1.Abort();
        }
        catch (Exception ex)
        {
        }

ВЫХОД. 98 98 98 98 79 79 79 79

Я хочу прервать поток, когда он также использует AWAIT.

Я могу сделать с CancellationToken / Task, но есть ли другой способ? Я хочу знать, почему поток не прерывается при использовании AWAIT.

Заранее спасибо. :)

1 Ответ

1 голос
/ 16 октября 2019

Я полагаю, что причиной поведения, которое вы наблюдаете, является то, что продолжение асинхронной операции запланировано в потоке ThreadPool. Таким образом, даже если вы прервали поток, в котором изначально выполнялся код, продолжение было запланировано, а затем выполнено в другом потоке.

Как уже упоминалось в комментариях, вы никогда не должны комбинировать явное использование потокас асинхронным / ожидающим . Более того, для всего нового кода, который вы пишете, async / await является предпочтительным подходом.

Вот ссылка на ответ Стивена Клири , который немного проясняет этобольше.

...