概述:C#中的异步编程有两主要方式:Task.Run用于在后台线程执行同步操作,而async-awAIt更适用于清晰表达异步流程 。基础用法展示了它们的简单应用,高级用法则演示了它们的结合使用,提供更灵活的异步编程模式
在C#中 , Task.Run和async-await都涉及异步编程,但用法和场景有所不同 。以下是详细讲解以及相应实例代码,包括基础和高级用法 。
基础用法:使用Task.Run:using System;using System.Threading.Tasks;class Program{static void Main(){Console.WriteLine("主线程开始");// 使用 Task.Run 在后台线程执行操作Task.Run(() => DoSomeWork());Console.WriteLine("主线程结束");Console.ReadLine();}static void DoSomeWork(){// 模拟耗时操作Console.WriteLine("后台线程开始工作");Task.Delay(2000).Wait();Console.WriteLine("后台线程完成工作");}}
使用async-await:using System;using System.Threading.Tasks;class Program{static async Task Main(){Console.WriteLine("主线程开始");// 使用 async-await 执行异步操作await DoSomeWorkAsync();Console.WriteLine("主线程结束");}static async Task DoSomeWorkAsync(){// 模拟异步操作Console.WriteLine("异步操作开始");await Task.Delay(2000); // 模拟异步工作Console.WriteLine("异步操作完成");}}
高级用法:使用Task.Run:using System;using System.Threading.Tasks;class Program{static async Task Main(){Console.WriteLine("主线程开始");// 使用 Task.Run 在后台线程执行操作,并等待完成await Task.Run(async () =>{Console.WriteLine("后台线程开始工作");await DoSomeWorkAsync();Console.WriteLine("后台线程完成工作");});Console.WriteLine("主线程结束");}static async Task DoSomeWorkAsync(){// 模拟异步操作await Task.Delay(2000); // 模拟异步工作}}
使用async-await:using System;using System.Threading.Tasks;class Program{static async Task Main(){Console.WriteLine("主线程开始");// 使用 async-await 执行多个异步操作await Task.WhenAll(DoSomeWorkAsync(), DoAnotherWorkAsync());Console.WriteLine("主线程结束");}static async Task DoSomeWorkAsync(){// 模拟异步操作Console.WriteLine("异步操作1开始");await Task.Delay(2000); // 模拟异步工作Console.WriteLine("异步操作1完成");}static async Task DoAnotherWorkAsync(){// 模拟异步操作Console.WriteLine("异步操作2开始");await Task.Delay(1000); // 模拟异步工作Console.WriteLine("异步操作2完成");}}
Task.Run适用于将同步操作放入异步上下文中 , 而async-await更适用于清晰表达异步流程 。在高级用法中,两者可以结合使用,根据具体情况选择使用哪种方式 。
【C#异步编程:Task.Run vs. async-await,掌握基础与高级用法】
推荐阅读
- 有了这五个方法,轻松处理异步任务
- C++多线程编程:解锁性能与并发的奥秘
- 异步Rust:构建实时消息代理服务器
- 主流编程语言哪个更容易学?
- 用于人工智能开发的主流编程语言都有哪些?
- 不容错过的4款宝藏GPTs:程序员新宠,让编程不再枯燥!
- 为什么编程术语看不懂,编程语言小知识
- 指针变量在C/C++中的内存占用
- 在 Rust 编程中使用泛型
- Go编程中调用外部命令的几种场景