在 C# 中优雅地终止线程可以通过使用 CancellationToken
实现。CancellationToken
是一种线程安全的机制,用于在多个线程之间传递取消操作信号。下面是一个使用 CancellationToken
优雅地终止线程的示例。
使用 CancellationToken
终止线程
-
创建
CancellationTokenSource
和CancellationToken
:
首先,需要创建一个CancellationTokenSource
对象,它包含一个CancellationToken
。CancellationToken
是线程之间传递取消信号的关键。CancellationTokenSource cts = new CancellationTokenSource(); CancellationToken token = cts.Token;
-
在线程中检查
CancellationToken
:
在要执行的线程中定期检查CancellationToken
的IsCancellationRequested
属性。如果该属性为true
,则线程应当优雅地终止其操作。void DoWork(CancellationToken token) { while (true) { if (token.IsCancellationRequested) { Console.WriteLine("Cancellation requested, stopping work."); break; } // 模拟一些工作 Console.WriteLine("Working..."); Thread.Sleep(1000); } }
-
启动线程并传递
CancellationToken
:
启动一个新的线程并传递CancellationToken
作为参数。Thread workerThread = new Thread(() => DoWork(token)); workerThread.Start();
-
请求取消操作:
在需要终止线程时,调用CancellationTokenSource
的Cancel
方法。这会设置CancellationToken
的IsCancellationRequested
属性为true
,从而通知线程终止其操作。// 让线程运行一段时间 Thread.Sleep(5000); // 请求取消操作 cts.Cancel(); // 等待线程终止 workerThread.Join(); Console.WriteLine("Worker thread has been terminated.");
完整代码示例
using System;
using System.Threading;
class Program
{
static void Main()
{
// 创建 CancellationTokenSource
CancellationTokenSource cts = new CancellationTokenSource();
CancellationToken token = cts.Token;
// 启动工作线程
Thread workerThread = new Thread(() => DoWork(token));
workerThread.Start();
// 让线程运行一段时间
Thread.Sleep(5000);
// 请求取消操作
cts.Cancel();
// 等待线程终止
workerThread.Join();
Console.WriteLine("Worker thread has been terminated.");
}
static void DoWork(CancellationToken token)
{
while (true)
{
if (token.IsCancellationRequested)
{
Console.WriteLine("Cancellation requested, stopping work.");
break;
}
// 模拟一些工作
Console.WriteLine("Working...");
Thread.Sleep(1000);
}
}
}
在这个示例中,工作线程每隔一秒钟检查一次 CancellationToken
是否已请求取消。如果请求取消,线程将优雅地停止工作并退出循环。主线程在等待5秒钟后请求取消操作并等待工作线程终止。通过这种方式,可以实现线程的优雅终止。