c# - 在线程中使用 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 时线程没有中止。
先感谢您。:)
解决方案
我想您观察到的行为的原因是异步操作的继续是在 ThreadPool 线程上安排的。因此,即使您已经中止了您的代码最初运行的线程,但仍会安排延续,然后在不同的线程上执行。
正如评论中已经提到的那样,您永远不应该将显式 Thread 使用与async / await结合起来。此外,对于您正在编写的所有新代码async / await是首选方法。
这是Stephen Cleary 的答案的链接,它更清楚地说明了这一点。
推荐阅读
- java - 我们可以在 ARCore 应用程序中突出显示所有检测到的平面吗?
- ios - 如何在 IOS Apps Swift 中处理强制关闭
- sql-server - 在 SSIS 中执行批处理脚本
- java - 无法对不完整的日期进行日期例外处理
- android - Android Firebase 身份验证在发布 APK 上不起作用
- c# - 避免重复对象初始值设定项以在 Linq-to-Entities 中创建派生对象而不使用 linq-to-objects
- c# - 使用websocket和http时的nginx配置?
- asp.net-mvc - 在asp.net mvc中从视图调用控制器并将值从视图传递给控制器
- node.js - Sequelize 重复键值违反唯一约束
- linux - 发现大小写错误的文件引用,因为文件系统区分大小写