欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

浅谈.NET Core异步方法

程序员文章站 2022-03-09 13:41:19
...

什么是异步编程?

同步程序中的代码运行在单一线程上。
异步操作:从其它线程发起后,在一个新的单独线程上运行的操作。发起异步操作的线程不必等待异步操作完成
为什么使用异步编程?
对于需要长时间运行的操作,异步编程可以更大限度更有效地利用设备资源。
通过异步执行 CPU 或 I/O 绑定操作,提高 UI 程序的响应性
并行计算

什么时候使用异步编程

异步适用于 CPU 绑定或 I/O 绑定操作,例如:
I/O 从网络检索数据
CPU 密集操作,例如使用大量数据进行科学计算
I/O 读写硬盘

最适合应用异步编程的程序

桌面 UI 程序

WinForms
WPF
UWP
Web Server 程序
Web Server 虽然不必与 UI 进行交互,但经常需要进行远程的数据库查询或计算分析大量数据,这些任务的执行时长都不算短。而作为 Web Server 又难免同时处理来自多个客户端的请求,这时引入异步编程可以避免先过来的请求发起的线程还在等待执行某些操作,后面的请求又来一大堆直接淹没了 WebServer,导致性能降低和延迟升高。

异步编程不是万能的

不要无脑使用异步,有些问题异步也无法解决,而且异步本身也会带来一些问题:
异步代码自身不带来任何的性能提升。它只让资源管理更高效异步代码给程序带来更大的开销
memory overhead:每个线程启动时要占用设备的虚拟内存
scheduler overhead:调度程序开销,操作系统需要管理该在哪个 CPU 执行哪个线程以及何时执行
如果你不是 UI 程序,而且你代码里面也没有网络或 I/O 绑定操作,异步对你基本没什么增益
如果你的程序是 CPU-bound,使用多线程技术(module 2)好过使用异步编程

NET 内置的异步方法

async 和 await 关键字
async 和 await 是 C# 异步编程的核心,由它们定义的方法称为异步方法
示例:

static void Main(string[] args)
        {
            CallWithAsyns();
            Console.ReadKey();
        }
        static Task<string> GeettingAsyne(string name)
        {
            Task<string> task = new Task<string>(() =>
            {
                Thread.Sleep(5000);
                return string.Format("你好!" + name);
            });
            task.Start();
            Console.WriteLine("启动任务");
            task.Wait(1000);
            return task;
        }
        async static void CallWithAsyns()
        {
            string result = await GeettingAsyne("张三");
            Console.WriteLine(result);
        }

什么是异步方方法?

方法签名包括 async 修饰符
约定方法名以 Async 为后缀
返回类型为以下几种之一 :Task, Task
void方法内部至少包含一句 await 表达式:
string urlContents = await getStringTask;
await 表达式的意思是:方法在此处需要等待异步操作完成后才能继续向下执行。同时方法将被挂起,控制流返回给方法的调用者

.NET Core 3.0 编写异步方法的步骤

1.方法声明中使用 async 关键字(必须)
2.调用异步方法时使用 await 关键字(必须)
3.在异步方法中使用正确的返回类型
a.Task:返回值类型为 TResult
b.Task:方法内没有 return 语句或 return;

相关标签: .Net Core c#