手机在线做ppt模板下载网站有哪些,无锡梅村网站建设,登封seo公司,网站建设方案的重要性【.NET Core】异步编程模式 文章目录 【.NET Core】异步编程模式一、概述二、基于任务的异步模式#xff08;TAP#xff09;2.1 TAP模式命名、参数和返回类型2.2 TAP初始化异步操2.3 TAP如何编译2.4 手动生成TAP方法2.5 混合方法实现TAP2.6 TAP中Await挂起执行2.7 TAP中使用Y…【.NET Core】异步编程模式 文章目录 【.NET Core】异步编程模式一、概述二、基于任务的异步模式TAP2.1 TAP模式命名、参数和返回类型2.2 TAP初始化异步操2.3 TAP如何编译2.4 手动生成TAP方法2.5 混合方法实现TAP2.6 TAP中Await挂起执行2.7 TAP中使用Yield和ConfigureAwait配置挂起和恢复 三、基于事件的异步模式EAP四、异步编程模型APM4.1 开始异步操作4.2 结束异步操作 一、概述
.NET提供了执行异步操作的三种模式
基于任务的异步模式TAP该模式使用单一方法表示异步操作的开始和完成。TAP是在.NET Framework 4 中引入的这是在.NET中进行异步编程的推荐方法。C#的async和await关键词和Await运算符为TAP添加了语言支持。**基于事件的异步模式EAP**是提供异步行为的基于事件的旧模型。这种模式需要后缀为Async的方法以及一个或多个事件事件处理程序委托类型和EventArg派生类型。EAP是在.NET Framework2.0中引入的。建议新开发中不再使用这种模式。异步编程模型模式APM也称为IAsyncResult模式这是使用IAsyncResult接口提供异步行为的旧模型。在APM模式下同步操作需要Begin和End方法。不建议新的开发使用此模式。
二、基于任务的异步模式TAP
在.NET中基于任务的异步模式是建议用于新开发的异步设计模式。它是基于System.Threading.Tasks命名中的Task和TaskTResult类型这个类型用于表示异步操作。
2.1 TAP模式命名、参数和返回类型
TAP使用单个方法表示异步操作的开始和完成。这与异步编码模型APM或IAsyncReult模式和基于事件的异步模式EAP形成对比。APM需要Begin和End方法。EAP需要后缀为Async的方法以及一个或多个事件事件处理程序委托类型和EventArg派生类型。
TAP中的异步方法在返回类型
System.Threading.Tasks.TaskSystem.Threading.Tasks.TaskTResult
具体返回类型取决于相应的同步方法返回的是void还是类型TResult。
TAP异步方法参数
TAP方法的参数应与其同步对应方法的参数匹配并应以相同顺序提供。但是out和ref参数不受此规则的限制并应完全避免。应该将通过out或ref参数返回的所有数据改为作为由TResult返回的TaskTResult的一部分返回且应使用元组或自定义数据结构来容纳多个值。即使TAP方法的同步对应项没有提供CancellationToken参数也应考虑添加此参数。
2.2 TAP初始化异步操
基于TAP的异步方法可以同步完成少量工作如在返回结果任务之前验证自变量和启动异步操作。应将同步工作保持最小以便异步方法可以快速返回。快速返回的原因包括
可以从用户界面线程调用异步方法因此所有长期运行的同步工作可能会降低应用程序的响应能力。可以同时启动多个异步方法因此在异步方法的同步部分中的任何长时间运行的工作都可以延迟其他异步操作的启动从而减少并发的优点。
2.3 TAP如何编译
自.NET Framework 4.5起任何归于async关键字的方法都被视为异步方法并且编译器会执行必要的转换以使用TAP异步实现方法。异步方法应返回System.Treading.Tasks.Task或System.Threading.Tasks.TaskTResult对象。对于后者函数的主体应该返回TResult,并且编译器确保此结果是通过生成的任务对象获得。同样未在方法的主体中处理的任何异常都会被封装处理未输出任务并导致生成的任务结束以TaskStatus.Faulted状态结束。此规则的异常发生在OperationCanceledException未得到处理时在这种情况下生成的任务以TaskStatus.Canceled状态结束。
2.4 手动生成TAP方法
手动实现TAP模式以更好的控制实现。编译器依赖从System.Threading.Tasks命名空间公开的公共外围应用和System.Runtime.CompilerServices命名空间中支持的类型。手动实现TAP,需要创建一个TaskCompletionSourceTResult对象执行异步操作并在操作完成时调用SetResult、SetException、SetCanceled方法或调用这些方法之一的Try版本。手动实现TAP方法时需在所在表示的异步操作完成生成的任务。例如
public static Taskint ReadTask(this Stream stream,byte[] buffer,int offset,int count,object state)
{var tcs new TaskCompletionSourceint();stream.BeginRead(buffer,offset,count,resp{try{tcs.SetResult(stream.EndRead(resp));}catch(Exception ex){tcs.SetException(ex);}},state);return tcs.Task;
}2.5 混合方法实现TAP
混合方法可以将核心逻辑委托给编译器。如果想验证编译器生成的异步方法之外的参数时可能需要使用这种混合方法以便异常可以转义到该方法的直接调用方而不是通过System.Threading.Tasks.Task对象被公开
public Taskint MethodAsync(string input)
{if(inputnull) throw new ArgumentNullException(input);return MethodAsyncInternal(input);
}
private async Taskint MethodAsyncInternal(string input)
{return value;
}2.6 TAP中Await挂起执行
使用await关键字开异步等待Task和TaskTResult对象。等待Task时await表达式的返回类型为void。等待TaskTResult时await表达式的类型为TResult。await表达式必须出现在异步方法的正文内。
实际上await 功能通过使用延续任务在任务上安装回叫。此回叫在挂起点恢复异步方法。 恢复异步方法时如果等待的操作已成功完成且为TaskTResult,返回的是TResult。如果等待的Task或TaskTResult以Canceked状态结束。就会抛出OpetationCanceledException异常。如果等待的Task或TaskTResult以Faulted状态结束就会抛出导致它发生故障的异常。一个Task可能由于多个异常而出错但只会传播一个异常。不过Task.Exception属性会返回包含所有错误AggregateException异常。
调用异步方法时将同步执行函数的正文直到遇见尚未完成的可等待实例上的第一个 await 表达式此时调用返回到调用方。如果异步方法不返回void将会返回Task或TaskTResult对象以表示正在进行的计算。在非void异常方法中如果遇到return语句或到达方法正文末尾任务就以RanToCompletion最终状态完成。如果未经处理的异常导致无法控制异步方法正文任务就以Faulted状态结束。如果异常为OperationCanceledException任务改为以Canceled状态结束。
2.7 TAP中使用Yield和ConfigureAwait配置挂起和恢复
使用Task.Yield方法将暂停点引入异步方法。
Task.Run(async delegate{int flag0;do{await Task.Yield();flag;}while(flag10000);
});使用Task.ConfigureAwait方法更好地控制异步方法中的暂停和恢复。默认情况下异步方法挂起时会捕获当前上下文捕获的上下文用于在恢复时调用异步方法的延续。
三、基于事件的异步模式EAP
System.Threading命名空间提供了创建高性能多线程应用程序所必需的所有工具但要想有效地使用这些工具需要有丰富的使用多线程软件工程的经验。对于相对简单的多线程应用程序BackgroundWorker组件提供了一个简单的解决方案。对于更复杂的异步应用程序考虑实现一个符合基于事件的异步模式的类。
基于事件的异步模式具有多线程应用程序的优点同时隐藏了多线程设计中固有的许多复杂的问题。使用EAP模式的能够
“在后台”执行耗时任务例如下载和数据库操作但不会中断你的应用程序。同时执行多个操作每个操作完成时都会接到通知。等待资源变得可用但不会停止“阻止”你的应用程序。使用熟悉的事件和委托模型与挂起的异步操作通信。
支持基于事件的异步模式的类将具有一个或多个命名为 MethodNameAsync 的方法。 这些方法可能会创建同步版本的镜像这些同步版本会在当前线程上执行相同的操作。 该类还可能具有 MethodNameCompleted 事件并且可能会具有 MethodNameAsyncCancel或只是 CancelAsync方法。
EAP常用的组件
许多组件都支持异步执行工作常用的有SoundPlayer和PictureBox组件可以“在后台”加载音频和图像同时主线程继续运行而不中断。
四、异步编程模型APM
使用IAsyncResult设计模式的异步操作时通过名微BeginOperatiobName和EndOperationName的两个方法来实现的这两个方法分别开始和结束异常操作OperationName。例如FileStream类提供BeginRead和EndRead方法来从文件异步读取字节。
在调用BeginOperationName后应用程序可以继续在调用线程上执行指令同时异步操作在另一个线程上执行。每次调用BeginOperationName时应用程序还调用EndOperationName来获取操作的结果。
4.1 开始异步操作
BeginOperationName方法开始异步操作OperationName并返回实现IAsyncResult接口的对象。IAsyncResult对象存储有关异步操作的信息。
编号成员描述1AsyncState一个特定应用程序的可选对象其中包含有关异步操作的信息2AsyncWaitHandle一个WaitHandle可用来在异步操作完成之前阻止应用程序执行。3CompletedSynchronously一个指指示异步操作是否是在用于调用BeginOperationName的线程上完成而不是在单独的ThreadPool线程上完成。4IsCompleted一个值指示异步操作是否已完成。
BeginOperationName 方法采用该方法的同步版本的签名中声明的任何参数由值传递或由引用传递。 BeginOperationName 方法签名中不包含任何输出参数。 BeginOperationName 方法签名另外还包括两个其他参数。 第一个参数定义一个 AsyncCallback委托此委托引用在异步操作完成时调用的方法。 如果调用方不希望在操作完成后调用方法它可以指定 null 在 Visual Basic 中为Nothing 。 第二个参数是一个用户定义的对象。 此对象可用来向异步操作完成时调用的方法传递应用程序特定的状态信息。 如果 BeginOperationName 方法还采用其他一些操作特定的参数例如一个用于存储从文件读取的字节的字节数组则 AsyncCallback和应用程序状态对象将是 BeginOperationName 方法签名中的最后两个参数。
BeginOperationName 立即返回对调用线程的控制。 如果 BeginOperationName 方法引发异常则会在开始异步操作之前引发异常。 如果 BeginOperationName 方法引发异常则意味着没有调用回调方法。
4.2 结束异步操作
EndOperationName方法用于结束异步操作OperationName。EndOperationName方法的返回值与其同步对应方法的返回值类型相同。并且是特定于异步操作的。
EndOperationName方法采用该方法同步版本的签名中声明的所有输出参数或引用参数。
如果调用EndOperationName时IAsyncResult对象表示的异步操作尚未完成则EndOperationName将在异步操作完成之前阻止调用线程。异步操作引发的异常是从EndOperationName方法引发的。未定义多次使用同一IAsyncResult调用EndOperationName方法的效果。