使用线程池进行异步任务处理的示例代码。在这个例子中,我们将使用ThreadPool类来提交任务到线程池,并使用CancellationToken来支持任务的取消。
using System;
using System.Threading;
using System.Threading.Tasks;
class Program
{
static void Main()
{
// 创建一个CancellationTokenSource,用于取消任务
var cts = new CancellationTokenSource();
var token = cts.Token;
// 将任务提交到线程池
ThreadPool.QueueUserWorkItem(async (state) =>
{
try
{
// 模拟一个可以取消的异步任务
await PerformLongRunningTask(token);
}
catch (OperationCanceledException)
{
// 任务被取消时的处理
Console.WriteLine("Task was canceled.");
}
});
// 模拟一些工作,然后取消任务
Console.WriteLine("Doing some work before canceling the task...");
Task.Delay(3000).Wait(); // 等待3秒
cts.Cancel(); // 取消任务
Console.WriteLine("Press Enter to exit the program.");
Console.ReadLine();
}
static async Task PerformLongRunningTask(CancellationToken token)
{
// 检查是否已发出取消请求
token.ThrowIfCancellationRequested();
// 模拟一个耗时的操作
Console.WriteLine("Starting long-running task in thread pool thread: " + Thread.CurrentThread.ManagedThreadId);
await Task.Delay(5000, token); // 模拟一个5秒的耗时操作,并可以响应取消请求
Console.WriteLine("Completed long-running task.");
}
}
创建了一个CancellationTokenSource来生成一个CancellationToken,该令牌用于传递取消信号给异步任务。
然后,使用ThreadPool.QueueUserWorkItem来将任务提交到线程池。
任务内部使用await PerformLongRunningTask(token)来执行一个可以响应取消请求的异步操作。
PerformLongRunningTask方法内部首先检查是否已发出取消请求,
然后模拟一个耗时的异步操作。这里使用Task.Delay来模拟耗时操作,并通过传递token来使其支持取消。
如果在等待期间取消了任务,Task.Delay会抛出一个OperationCanceledException异常,在catch块中捕获这个异常并打印一条消息。
在Main方法中,模拟了一些工作,然后等待3秒钟后取消任务。
这可以通过调用cts.Cancel()来实现,它会设置CancellationToken的取消状态,从而允许正在运行的任务检测到取消请求并相应地响应。