浅谈.NET Core异步方法
什么是异步编程?
同步程序中的代码运行在单一线程上。
异步操作:从其它线程发起后,在一个新的单独线程上运行的操作。发起异步操作的线程不必等待异步操作完成
为什么使用异步编程?
对于需要长时间运行的操作,异步编程可以更大限度更有效地利用设备资源。
通过异步执行 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;
上一篇: Qt工程生成MiniDump文件
下一篇: Qt输入中文出现乱码的解决方法
推荐阅读
-
.NET Core类库System.Reflection.DispatchProxy实现简易Aop的方法
-
asp.net core下给网站做安全设置的方法详解
-
.NET Core单文件发布静态编译AOT CoreRT的方法详解
-
ASP.NET Core MVC 过滤器的使用方法介绍
-
浅谈ASP.NET Core 2.0 部分视图(译)
-
C#/.NET/.NET Core定时任务调度的方法或者组件有哪些--Timer,FluentScheduler还是...
-
Hangfire在ASP.NET CORE中的简单实现方法
-
asp.net异步获取datatable并显示的实现方法
-
使用.NET Core3.0创建一个Windows服务的方法
-
浅谈Android中使用异步线程更新UI视图的几种方法