C# Task的使用 详细介绍(含同步异步解释)

本文介绍了C#中异步编程的关键概念,包括如何定义可等待的异步方法,使用async/await关键字处理延迟和等待,以及Task.Run、Task.WhenAll、Task.Exception等方法的用法,展示了并行执行任务和管理异步操作的各种技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们在程序当中,会有些的执行代码需要一定的时间 我们需要等待如加载大量数据,等待延时

定义可等待的异步方法(无返回值) 

public  Task MyVoid()
      {

      }

定义可等待的异步方法返回类型为Bool类型 

public Task<string> MyVoid() => Task.FromResult("");就是返回当前的值 代替 return 返回值的效果

异步可等待的方法当中,有某些代码需要等待,那么可以加上 async await 关键字。 当前关机键通常都要成对出现 如有async 没有await那么程序不会等待

定义方式:

public async Task<string> MyVoid() => await Task.FromResult("");

异步可等待的方法当中,有某些代码需要等待,那么可以加上 async await 关键字。 当前关机键通常都要成对出现 如有async 没有await那么程序不会等待

定义方式:

public async Task<string> MyVoid() => await Task.FromResult("");

定义某些代码执行方式为异步执行

 Task.Run(() =>
            {
                //需要异步执行的代码
                //延时500
                Task.Delay(500);
            });

定义某些代码可以等待异步执行

Task.Run(async() =>
            {
                //需要异步执行的代码
                //延时500
             await   Task.Delay(500);
            });

定义包含返回值的异步代码

Task<int> task = Task.Run(() =>
{
    // 异步操作的代码逻辑
    return 42; // 返回异步操作的结果
});

// 在任务完成后,可以获取任务的结果
int result = task.Result;

等待 Task 的完成:

Task<int> task = Task.Run(() =>
{
    // 异步操作的代码逻辑
    return 42;
});

// 等待任务完成
task.Wait();

// 获取任务的结果
int result = task.Result;

拓展 Task 中的常见用法

1 Task.WhenAll() 是 Task 类的一个静态方法    效果等待多个线程执行完毕 通常伴随着 await关键字使用(等待返回的任务的完成)。(如果不带await那么将无法获得任务的结果,从来进行后续的、错误处理和异常处理、控制程序流程、线程同步和依赖关系等)它接受一个 Task 数组或可变参数列表作为参数,并返回一个新的任务,该任务在所有输入任务都完成时完成。它非常适用于需要并行执行多个任务并在它们都完成后执行某些操作的场景

示例:

Task task1 = Task.Run(() =>
    {
        // 第一个任务的代码逻辑
    });

    Task task2 = Task.Run(() =>
    {
        // 第二个任务的代码逻辑
    });

    // 等待所有任务完成
    await Task.WhenAll(task1, task2);

    // 所有任务都已完成
    Console.WriteLine("所有任务已完成");

2 Task.Exception: 获取任务的异常。

3 Task.Run() 或 Parallel.Invoke(): 并行执行多个任务或操作。

Parallel.Invoke(Test0, Test1);// 用于执行多个操作 
            Task task = Task.Run(Test2);// 用于后台线程上执行单个操作
            //Task.Run() 可以使用 async/await 模式来异步执行操作,而 Parallel.Invoke() 不支持异步模式

4  Parallel.ForEach() 方法用于并行迭代集合中的元素执行操作的方法

示例 并行迭代整数列表中的元素,并计算它们的总和:

int[] numbers = { 1, 2, 3, 4, 5 };
long total = 0;

Parallel.ForEach(numbers, number =>
{
    total += number;
});

Console.WriteLine("Total: {0}", total);

5 Task.WhenAny(): 等待多个任务中的任意一个完成

示例。方法接受一个 Task 对象数组作为参数,并返回一个 Task 对象,该对象表示已完成的任务之一https://learn.microsoft.com/zh-cn/dotnet/api/system.threading.tasks.task.whenany?view=net-7.0

Task.Run(async() =>
            {
                Task<int> task1 = Task.Run(() => { return 1; });
                Task<int> task2 = Task.Run(() => { return 2; });
                Task<int> task3 = Task.Run(() => { return 3; });

                Task<int>[] tasks = { task1, task2, task3 };

                Task<int> completedTask = await Task.WhenAny(tasks);

                Console.WriteLine("Completed task result: {0}", completedTask.Result);// completedTask.Result 返回完成任务的结果 返回的结果是任意一个完成的任务结果
            });

 6 ContinueWith(): 创建一个新的任务,在原始任务完成后执行额外的操作。

示例

// 通过ContinueWith()方法创建一个新任务
            // 在task1在创建一个任务 T 就是task1 本身  
            //这段代码就是 返回穿字符串
            Task<string> task2 = task1.ContinueWith(t => $"The answer is {t.Result}");
            Console.WriteLine(task2.Result); // 输出task2返回结果:The answer is 42  字符串

7 Task.Factory.StartNew():

提供更多的选项来创建和配置任务,例如指定任务类型、调度器等。

以下代码演示了如何使用 Task.Factory.StartNew() 方法来创建一个新的任务

Task<int> task1 = Task.Factory.StartNew(() => { return 1; });

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学软件开发的猪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值