首页 > 解决方案 > 在线程中使用 AWAIT 时,Thread.Abort() 不起作用。C#

问题描述

我有一个按钮,当我单击它时,我正在创建一个线程,10 秒后我将中止它。当我再次单击该按钮时,它会创建新线程,但问题是当我使用 AWAIT 时,该线程不会中止。应用程序正在用新创建的线程显示旧线程的值。但是当我不使用 AWAIT 时,它工作正常。下面只是我的代码示例。

带有 AWAIT 的逻辑(您可以在下图中看到旧线程也在运行) 点击查看图片

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

没有等待的逻辑(下面的逻辑工作文件)。 点击查看图片

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 时线程没有中止。

先感谢您。:)

标签: c#multithreadingasync-await

解决方案


我想您观察到的行为的原因是异步操作的继续是在 ThreadPool 线程上安排的。因此,即使您已经中止了您的代码最初运行的线程,但仍会安排延续,然后在不同的线程上执行。

正如评论中已经提到的那样,您永远不应该将显式 Thread 使用与async / await结合起来。此外,对于您正在编写的所有新代码async / await是首选方法。

这是Stephen Cleary 的答案的链接,它更清楚地说明了这一点。


推荐阅读