当前位置: 首页 > article >正文

C# Task的使用

C#中的Task类是.NET框架中用于实现异步编程的核心组件之一,它在.NET Framework 4及更高版本以及.NET Core中广泛使用。Task对象代表一个异步操作,并提供了跟踪异步操作状态、获取结果和处理完成通知的方法。

Task 类提供了对异步操作的封装,使得开发人员可以更容易地编写异步代码。Task 类位于 System.Threading.Tasks 命名空间下。在C#中,使用Task可以很方便地执行并行任务。

 

以下是C#中Task的几种常见用法:

1.执行异步操作:

使用Task.Run()方法可以将工作提交给线程池来异步执行:

Task<int> task = Task.Run(() =>
{
    int result = LongRunningCalculation(); // 长时间运行的计算
    return result;
});

// 等待任务完成并获取结果
int finalResult = await task;

2.Async/Await:

在异步方法中结合async和await关键字来编写流畅的异步代码:

async Task<int> AsyncMethod()
{
    // 异步等待网络请求或IO操作等
    var data = await DownloadDataAsync();
    // 处理数据...
    return ProcessedData;
}

// 调用异步方法
Task<int> task = AsyncMethod();
// 如果需要等待结果
int result = await task;

3.创建和启动Task:

除了Task.Run(),还可以直接实例化Task并通过.Start()方法手动启动:

Task task = new Task(() => DoSomething());
task.Start();

或者使用TaskFactory创建并开始新任务:

TaskFactory factory = new TaskFactory();
Task task = factory.StartNew(() => DoSomethingLong("Using TaskFactory"));

4.取消任务:

可以通过传递CancellationToken到Task.Run()或Task.Factory.StartNew()来支持任务取消:

CancellationTokenSource cts = new CancellationTokenSource();

Task task = Task.Run(async () =>
{
    while (!cts.IsCancellationRequested)
    {
        // 执行循环操作直到取消令牌被标记
    }
    
    cts.Token.ThrowIfCancellationRequested(); // 如果已取消,则抛出异常
}, cts.Token);

// 某个时刻取消任务
cts.Cancel();

5.同步等待(非推荐):

在特定场景下,可以直接同步等待任务完成,但这通常会导致当前线程阻塞:
 

Task.Wait(); // 不推荐,可能导致死锁

6.异步等待多个任务完成:

使用Task.WhenAll()等待多个任务同时完成:

Task[] tasks = new Task[5];
for (int i = 0; i < 5; i++)
{
    tasks[i] = Task.Run(() => SomeWork(i));
}

await Task.WhenAll(tasks);

7.等待任意任务完成:

使用Task.WhenAny()等待任意一个任务完成:

Task[] tasks = ...;
Task completedTask = await Task.WhenAny(tasks);

 

以上仅是对C#中Task类使用的一些基本示例。

 

请注意,

实际开发中,可能根据具体需求进行更复杂的异步编程。需

要根据具体情况来评估任务的大小和数量,以确保并行任务的效率和可靠性。

 


http://www.kler.cn/a/229211.html

相关文章:

  • 清除前端缓存的方式
  • linux之进程信号(初识信号,信号的产生)
  • OpenCV实现Kuwahara滤波
  • 【RDMA学习笔记】1:RDMA(Remote Direct Memory Access)介绍
  • 【Rust自学】12.2. 读取文件
  • 游戏市场成果及趋势
  • docker部署自己的网站wordpress
  • [vscode]ssh报错: Resolver error: Error: XHR failedscode错误
  • JVM工作原理与实战(三十六):GraalVM虚拟机
  • 从小白到入门webrtc音视频通话
  • 数据库学习笔记2024/2/5
  • vue element 组件 form深层 :prop 验证失效问题解决
  • 【Flink入门修炼】1-1 为什么要学习 Flink?
  • RAG 新路径!提升开发效率、用户体验拉满
  • Linux内核与驱动面试经典“小”问题集锦(3)
  • Kubernetes实战(二十五)-快速下载k8s.gcr.io,gcr.io,quay.io镜像
  • 高宇辰:打造“π”型人才 | 提升之路系列(七)
  • strtok的使用
  • 政安晨:机器学习快速入门(二){基于Python与Pandas} {建立您的第一个机器学习模型}
  • 看论文利器:paperswithcode
  • 算法学习——华为机考题库10(HJ64 - HJ69)
  • LLVM实战之将.ll文件转换成bitcode文件
  • 蓝桥杯(Web大学组)2023十四届省赛真题3:收集帛书碎片
  • 14.2 url后端过滤器(❤❤)
  • 数据结构高级算法
  • RFID手持终端_智能pda手持终端设备定制方案