c# - 在没有“Thread.Abort()”的情况下立即停止 C# 线程
问题描述
public class Worker
{
private CancellationTokenSource cts;
private Thread t;
public Worker()
{
cts = new CancellationTokenSource();
t = new Thread(() => { ThreadTask(cts.Token); });
}
~Worker()
{
cts.Dispose();
}
private void ThreadTask(CancellationToken ct)
{
try
{
while (true)
{
if (ct.IsCancellationRequested)
{
Debug.WriteLine("Cancelllation requested");
break;
}
// long task 1
Debug.WriteLine("Task 1 completed");
Thread.Sleep(2000);
// long task 2
Debug.WriteLine("Task 2 completed");
Thread.Sleep(2000);
// long task 3
Debug.WriteLine("Task 3 completed");
Thread.Sleep(2000);
// long task 4
Debug.WriteLine("Task 4 completed");
Thread.Sleep(2000);
Debug.WriteLine("All tasks completed");
}
}
catch (Exception ex)
{
Debug.WriteLine("Thread exception: " + ex.ToString());
}
finally
{
// cleanup
Debug.WriteLine("Thread cleanup");
}
}
public void Start()
{
t.Start();
}
public void Stop()
{
cts.Cancel();
}
}
我想知道是否可以在线程完成执行之前中断它。
例如,在上面描述的代码中,当调用一个函数时Stop()
,线程将在它完成执行后停止,我想更快地停止它,例如在“长任务”之间甚至在Thread.Sleep(2000)
.
Stop()
一个解决方案是在调用like时可能在任务线程中抛出异常Thread.Abort()
,但Thread.Abort()
在 Net 6.0 上不起作用,我该怎么做?
环境:
- C#
- 净 6.0
- 视窗 10 x64
- Visual Studio 2019 和 Visual Studio 2022
解决方案
您可以使用该Thread.Interrupt
方法。当前的 .NET 平台支持此 API。
中断处于
WaitSleepJoin
线程状态的线程。如果该线程当前没有被阻塞在等待、睡眠或加入状态,它将在下一次开始阻塞时被中断。
ThreadInterruptedException
在被中断的线程中抛出,但直到线程阻塞。如果线程从不阻塞,则永远不会抛出异常,因此线程可能会在不被中断的情况下完成。
您必须在委托ThreadInterruptedException
主体内部处理可能的情况,否则在调用 时进程可能会崩溃。或者您可以使用通用处理程序处理所有异常,就像您目前正在做的那样。ThreadStart
Interrupt
catch (Exception)
推荐阅读
- excel - 调试 Excel 宏
- ruby-on-rails - React 应用程序设计:在导航中显示每个页面的记录数
- r - to.period 函数保留“缺失值”
- java - JAVA 数组索引超出范围,即使 < 数组长度
- c++ - Total C++ Noob:Boost 和 std 的文件 I/O 问题
- sql - 如何在不手动指定 PK 的情况下仅将唯一数据加载到我的 oracle 表中?
- java - 创建一个名为 calcWinPercentage() 的方法。我们必须确保我们不除以 0 。如果没有玩过游戏,返回-1
- objective-c - 如何将对象 c 传输到 Swift aout collectionVIewLayout
- c++ - 尝试在 C++ 中的 if 语句中定义字符串
- javascript - 有条件的 mongoDB 投影有问题