我们在程序当中,会有些的执行代码需要一定的时间 我们需要等待如加载大量数据,等待延时
定义可等待的异步方法(无返回值)
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.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; });