ToB企服应用市场:ToB评测及商务社交产业平台

标题: 你最擅长使用哪个异步编程模式? [打印本页]

作者: 美食家大橙子    时间: 2024-11-26 08:45
标题: 你最擅长使用哪个异步编程模式?

前言

异步编程模式指的是在进行异步编程时所采用的一种编程模式,主要包括TAP、EAP和APM三种模式。

TAP模式是目前.NET平台中保举使用的异步编程模式,它比EAP和APM模式更为简单、清晰,同时也提供了更好的异常处理和取消操作支持。
异步编程模式TAP、EAP和APM的综合对比:


异步编程模式示例代码

TAP模式示例代码:

TAP模式使用async/await语法
  1. using System;
  2. using System.Threading.Tasks;
  3. public class Program
  4. {
  5.     public static async Task Main(string[] args)
  6.     {
  7.         await Task.Delay(1000); // 模拟一个异步操作
  8.         Console.WriteLine("TAP模式示例:异步操作完成");
  9.     }
  10. }
复制代码
EAP模式示例代码:

EAP模式使用事件机制。
  1. using System;
  2. using System.ComponentModel;
  3. public class Program
  4. {
  5.     public static void Main(string[] args)
  6.     {
  7.         var worker = new BackgroundWorker();
  8.         worker.DoWork += (sender, e) =>
  9.         {
  10.             System.Threading.Thread.Sleep(1000); // 模拟一个耗时操作
  11.         };
  12.         worker.RunWorkerCompleted += (sender, e) =>
  13.         {
  14.             Console.WriteLine("EAP模式示例:异步操作完成");
  15.         };
  16.         worker.RunWorkerAsync();
  17.     }
  18. }
复制代码
APM模式示例代码:

而APM模式则通过BeginOperation和EndOperation方法以及回调函数的方式来实现。
  1. using System;
  2. using System.Threading;
  3. public class Program
  4. {
  5.     public static void Main(string[] args)
  6.     {
  7.         var result = BeginOperation((ar) =>
  8.         {
  9.             // 异步操作完成时的回调函数
  10.             EndOperation(ar);
  11.             Console.WriteLine("APM模式示例:异步操作完成");
  12.         });
  13.     }
  14.     private static IAsyncResult BeginOperation(AsyncCallback callback)
  15.     {
  16.         var worker = new Worker();
  17.         return worker.BeginOperation(callback, null);
  18.     }
  19.     private static void EndOperation(IAsyncResult result)
  20.     {
  21.         var worker = (Worker)((AsyncResult)result).AsyncDelegate;
  22.         worker.EndOperation(result);
  23.     }
  24. }
  25. public class Worker
  26. {
  27.     public IAsyncResult BeginOperation(AsyncCallback callback, object state)
  28.     {
  29.         var result = new WorkerAsyncResult(callback, state);
  30.         ThreadPool.QueueUserWorkItem(DoOperation, result);
  31.         return result;
  32.     }
  33.     public void EndOperation(IAsyncResult result)
  34.     {
  35.         // 在这里处理异步操作的结果
  36.     }
  37.     private void DoOperation(object state)
  38.     {
  39.         // 执行异步操作
  40.         Thread.Sleep(1000); // 模拟一个耗时操作
  41.         var result = (WorkerAsyncResult)state;
  42.         result.Complete();
  43.     }
  44. }
  45. public class WorkerAsyncResult : IAsyncResult
  46. {
  47.     private ManualResetEvent _waitHandle = new ManualResetEvent(false);
  48.     public AsyncCallback Callback { get; }
  49.     public object AsyncState { get; }
  50.     public WorkerAsyncResult(AsyncCallback callback, object state)
  51.     {
  52.         Callback = callback;
  53.         AsyncState = state;
  54.     }
  55.     public bool IsCompleted { get; private set; }
  56.     public WaitHandle AsyncWaitHandle => _waitHandle;
  57.     public object AsyncState => null;
  58.     public bool CompletedSynchronously => false;
  59.     public void Complete()
  60.     {
  61.         IsCompleted = true;
  62.         _waitHandle.Set();
  63.         Callback?.Invoke(this);
  64.     }
  65. }
复制代码
这些示例代码分别展示了TAP、EAP和APM模式下的异步操作的实现方式。
你知道吗?

Thread 属于传统的多线程编程模式,它是一种基于线程的同步编程模式。在这种模式下,需要显式地创建和管理线程,并通过锁、信号量等同步原语来实现线程之间的通信和协调。这种模式需要手动处理线程的创建、烧毁和同步,容易出现死锁、竞态条件等问题,同时也倒霉于异步编程和并发控制。
Thread 不属于 TAP、EAP或APM 模式。Thread 是传统的多线程编程模型,它是基于线程的同步编程模型,需要开辟职员显式地创建和管理线程。TAP、EAP和APM 则是用于异步编程的模式,它们提供了更高级别的抽象和更方便的异步操作管理方式。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4