【C# 异步方法】async/await
2021/12/15 1:46:49
本文主要是介绍【C# 异步方法】async/await,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
async标志
async总结:
async是一个标志,告诉编译器这是一个异步方法。编译器根据这个标志 将带有async标志的异步方法转化为一个异步状态机。
Task背后有一个名为的TaskScheduler的类来处理Task在Thread上的执行。可以这样说TaskScheduler和Task就是.NET4.0中异步和并发操作的基础,也是我们写代码时不二的选择。
返回值为async Task<int>的异步方法的刨析
async是什么呢?我通过一段代码来了解,案例源代码如下:
namespace MyTask; class Program { public static void Main(string[] args) { Task<int> baconTask = FryBaconAsync(3); Console.Read(); } static async Task<int> FryBaconAsync(int slices) { return 3; //整数3和Task<int>不存在隐形转化啊,怎么就可以return 3; 如果你也存在这个疑问 请继续往下阅读,接下去详细分析。 } }
ILspy反编译后代码:
// MyTask.Program using System; using System.Diagnostics; using System.Runtime.CompilerServices; using System.Threading.Tasks; using MyTask; [System.Runtime.CompilerServices.NullableContext(1)] [System.Runtime.CompilerServices.Nullable(0)] internal class Program { [CompilerGenerated] private sealed class <FryBaconAsync>d__1 : IAsyncStateMachine { public int <>1__state; [System.Runtime.CompilerServices.Nullable(0)] public AsyncTaskMethodBuilder<int> <>t__builder; public int slices; private void MoveNext() { int num = <>1__state; int result; try { result = 3; } catch (Exception exception) { <>1__state = -2; <>t__builder.SetException(exception); return; } <>1__state = -2; <>t__builder.SetResult(result); } void IAsyncStateMachine.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext this.MoveNext(); } [DebuggerHidden] private void SetStateMachine(IAsyncStateMachine stateMachine) { } void IAsyncStateMachine.SetStateMachine(IAsyncStateMachine stateMachine) { //ILSpy generated this explicit interface implementation from .override directive in SetStateMachine this.SetStateMachine(stateMachine); } } public static void Main(string[] args) { Task<int> baconTask = FryBaconAsync(3); Console.Read(); } [AsyncStateMachine(typeof(<FryBaconAsync>d__1))] [DebuggerStepThrough] private static Task<int> FryBaconAsync(int slices) { <FryBaconAsync>d__1 stateMachine = new <FryBaconAsync>d__1(); stateMachine.<>t__builder = AsyncTaskMethodBuilder<int>.Create(); stateMachine.slices = slices; stateMachine.<>1__state = -1; stateMachine.<>t__builder.Start(ref stateMachine); return stateMachine.<>t__builder.Task; } }
以下开始分析IL代码和源代码:
用到的知识点:IAsyncStateMachine接口、AsyncTaskMethodBuilder<TResult>类,这两个功能必须详细理解。
编译器具体的执行过程:
1、编译器会根据async标记给异步方法生成 一个叫AsyncStateMachine异步状态机的特性附着于方法上,告诉运行时这是一个异步状态机。
2、然后生成一个异步状态机的类,该类继承IAsyncStateMachine接口。IAsyncStateMachine接口有两个方法:MoveNext()、SetStateMachine();该类除了以上两个方法,还有重要两字段
AsyncTaskMethodBuilder<TResult> 表示返回任务的异步方法生成器。state 状态。
源代码中return 3;在MoveNext()方法中被打包进了AsyncTaskMethodBuilder<TResult> 异步方法生成器中。最后返回任务(返回值)是通过异步方法生成器stateMachine.<>t__builder.Task获取。该属性类型是Task<TResult>。
通过IL代码我们就可以清楚的得知async就是语法糖。
到此开头留下为什么能返回return 3;的问题就解答完了。
这篇关于【C# 异步方法】async/await的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2022-03-01沐雪多租宝商城源码从.NetCore3.1升级到.Net6的步骤
- 2024-12-06使用Microsoft.Extensions.AI在.NET中生成嵌入向量
- 2024-11-18微软研究:RAG系统的四个层次提升理解与回答能力
- 2024-11-15C#中怎么从PEM格式的证书中提取公钥?-icode9专业技术文章分享
- 2024-11-14云架构设计——如何用diagrams.net绘制专业的AWS架构图?
- 2024-05-08首个适配Visual Studio平台的国产智能编程助手CodeGeeX正式上线!C#程序员必备效率神器!
- 2024-03-30C#设计模式之十六迭代器模式(Iterator Pattern)【行为型】
- 2024-03-29c# datetime tryparse
- 2024-02-21list find index c#
- 2024-01-24convert toint32 c#