优秀的编程知识分享平台

网站首页 > 技术文章 正文

c#.Net.NetCore面试(二十九)线程池和async/await实现任务取消

nanyue 2024-08-30 20:44:57 技术文章 5 ℃

使用线程池进行异步任务处理的示例代码。在这个例子中,我们将使用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的取消状态,从而允许正在运行的任务检测到取消请求并相应地响应。

最近发表
标签列表