微信群里的一个提问引发的这个问题,C#异步有多少种实现方式?首先想要知道C#异步有多少中实现方式,首先我们要知道.NET提供的执行异步操作的三种模式,然后再去了解C#异步实现的方式。
.NET异步编程模式
.NET 提供了执行异步操作的三种模式:
- 基于任务的异步模式 (TAP) ,该模式使用单一方法表示异步操作的开始和完成。TAP 是在 .NET Framework 4 中引入的。 这是在 .NET 中进行异步编程的推荐方法。C# 中的 async 和 await 关键词以及 Visual Basic 中的 Async 和 Await 运算符为 TAP 添加了语言支持。有关详细信息,请参阅基于任务的异步模式 (TAP)。
- 基于事件的异步模式 (EAP),是提供异步行为的基于事件的旧模型。这种模式需要后缀为 Async 的方法,以及一个或多个事件、事件处理程序委托类型和 EventArg 派生类型。EAP 是在 .NET Framework 2.0 中引入的。建议新开发中不再使用这种模式。有关详细信息,请参阅基于事件的异步模式 (EAP)。
- 异步编程模型 (APM) 模式(也称为 IAsyncResult 模式),这是使用 IAsyncResult 接口提供异步行为的旧模型。在这种模式下,同步操作需要 Begin 和 End 方法(例如,BeginWrite 和 EndWrite以实现异步写入操作)。不建议新的开发使用此模式。有关详细信息,请参阅异步编程模型 (APM)。
C#异步有四种实现方式
C# 异步有多种实现方式,可归纳为以下几类:
1、异步方法(Async Method TAP模式)
使用async/await关键字实现异步编程,这是比较常用的一种异步实现方式。例如:
1 2 3 4
| public async Task TestDoSomeAsync() { await Task.Delay(1000); Console.WriteLine("Async method completed."); }
|
2、任务并行库(TPL, Task Parallel Library TAP模式)
通过 Task 和 Task 类型实现异步编程,可以利用多核处理器,并发执行多个独立的任务。例如:
1 2 3 4 5 6 7 8 9 10
| public static async void Main(string[] args) { await Task.Run(() => { Console.WriteLine("Test Task 1 completed."); }); await Task.Run(() => { Console.WriteLine("Test Task 2 completed."); }); Task.WaitAll(); }
|
3、Asynchronous Programming Model(APM模式)
是一种经典的异步编程模式,需要手动创建回调函数,用于处理完成或错误的通知。可以通过 IAsyncResult 设计模式的 Begin 和 End 方法来实现,其中 Begin 方法开始异步操作,而 End 方法在异步操作完成时执行,并返回异步操作的结果。
需要注意的是,APM 模式通过 IAsyncResult 接口来存储异步操作的状态和结果,相对比较复杂,代码量也较大。同时,在使用 APM 模式时,还需要手动处理回调函数和等待异步操作完成等细节工作,使得开发起来相对较为繁琐。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
| class Program { static void Main(string[] args) { MyAsyncClass asyncClass = new MyAsyncClass(); IAsyncResult result = asyncClass.BeginDoWork(null, null); int res = asyncClass.EndDoWork(result); Console.WriteLine("Result: " + res); Console.ReadLine(); } } class MyAsyncClass { public IAsyncResult BeginDoWork(AsyncCallback callback, object state) { MyAsyncResult result = new MyAsyncResult(state); Thread thread = new Thread(() => { try { int res = 1 + 2; result.Result = res; callback?.Invoke(result); } catch (Exception ex) { result.Error = ex; callback?.Invoke(result); } }); thread.Start(); return result; } public int EndDoWork(IAsyncResult result) { MyAsyncResult myResult = (MyAsyncResult)result; myResult.AsyncWaitHandle.WaitOne(); if (myResult.Error != null) { throw myResult.Error; } return myResult.Result; } } class MyAsyncResult : IAsyncResult { public bool IsCompleted => AsyncWaitHandle.WaitOne(0); public WaitHandle AsyncWaitHandle { get; } = new ManualResetEvent(false); public object AsyncState { get; } public bool CompletedSynchronously => false; public int Result { get; set; } public Exception Error { get; set; } public MyAsyncResult(object asyncState) { AsyncState = asyncState; } }
|
4、Event-based Asynchronous Pattern(EAP模式)
一种已过时的异步编程模式,需要使用事件来实现异步编程。例如:
需要注意的是,EAP 模式通过事件来实现异步编程,相对于 APM 模式更加简洁易懂,同时也避免了手动处理回调函数等细节工作。但是,EAP 模式并不支持 async/await 异步关键字,因此在一些特定的场景下可能不够灵活。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| public class MyAsyncClass : Component {
public delegate int MyAsyncDelegate(int arg); public event MyAsyncDelegate OperationNameCompleted; public void DoWorkAsync(int arg) { ThreadPool.QueueUserWorkItem(new WaitCallback(DoWork), arg); } private void DoWork(object obj) { int arg = (int)obj; int res = arg + 1; OperationNameCompleted?.Invoke(res); } }
|
以上就是C#实现异步的常用方式总结的详细内容。欢迎留言讨论!
版权声明:本文来源于网友收集或网友供稿,仅供学习交流之用,如果有侵权,请转告小编或者留言,本站立即删除。