1.基于任务的异步模式 (TAP)【推荐使用】 :该模式使用单一方法表示异步操作的开始和完成,TAP 是在 .NET Framework 4 中引入的。这是在 .NET 中进行异步编程的推荐方法。 C# 中的 async 和 await 关键词以及 Visual Basic 中的 Async 和 Await 运算符为 TAP 添加了语言支持。
2.基于事件的异步模式 (EAP):是提供异步行为的基于事件的旧模型, 这种模式需要后缀为 Async 的方法,以及一个或多个事件、事件处理程序委托类型和 EventArg 派生类型。EAP 是在 .NET Framework 2.0 中引入的。建议新开发中不再使用这种模式。
3.异步编程模型 (APM) 模式(也称为 IAsyncResult 模式):这是使用 IAsyncResult 接口提供异步行为的旧模型, 在这种模式下,同步操作需要 Begin 和 End 方法(例如,BeginWrite 和 EndWrite以实现异步写入操作)。不建议新的开发使用此模式。
/// <summary> /// 异步方法(Async Method TAP模式) /// </summary> /// <returns></returns> public static async Task TestDoSomeAsync() { await Task.Delay(1000 * 10).ConfigureAwait(false); //等待10秒 Console.WriteLine("Async Method Completed."); }二、任务并行库(TPL, Task Parallel Library TAP模式)
/// <summary> /// 任务并行库(TPL, Task Parallel Library TAP模式) /// </summary> public static void TestTaskParallel() { var task1 = Task.Run(() => { Console.WriteLine("Task 1 Completed."); }); var task2 = Task.Run(() => { Console.WriteLine("Task 2 Completed."); }); Task<int> task3 = Task.Factory.StartNew(() => { Console.WriteLine("Task 3 Completed."); return 20; // 返回一个整数值 }); //等待所有任务完成 Task.WaitAll(task1, task2, task3); }三、Asynchronous Programming Model(APM模式)
/// <summary> /// Asynchronous Programming Model(APM模式) /// </summary> public static void TestAPMAsync() { // 创建一个 AsyncCallback 委托,用于处理异步操作完成后的回调 var callback = new AsyncCallback(AsyncOperationCallback); // 创建一个异步委托实例,表示要异步执行的操作 var asyncMethod = new Func<int, string>(AsyncMethod); // 开始异步操作 var result = asyncMethod.BeginInvoke(88, callback, asyncMethod); Console.WriteLine($"TestAPMAsync Completed."); Console.ReadLine(); } private static string AsyncMethod(int parameter) { Console.WriteLine("AsyncMethod开始执行了..."); return $"异步操作完成,参数为:{parameter}。"; } private static void AsyncOperationCallback(IAsyncResult result) { try { // 从异步状态对象中获取返回的异步委托 Func<int, string> asyncMethod = (Func<int, string>)result.AsyncState; string message = asyncMethod.EndInvoke(result); Console.WriteLine(message); } catch (Exception ex) { Console.WriteLine($"异步操作发生异常:{ex.Message}"); } }四、Event-based Asynchronous Pattern(EAP模式)
/// <summary> /// 堆代码 duidaima.com /// Event-based Asynchronous Pattern(EAP模式) /// </summary> static void Main(string[] args) { var asyncObj = new MyAsyncClass(); // 订阅异步操作完成事件 asyncObj.OperationNameCompleted += AsyncObjOperationNameCompleted; // 启动异步操作 asyncObj.DoWorkAsync(10); Console.ReadLine(); } /// <summary> /// 异步操作完成事件的处理方法 /// </summary> /// <param name="result">result</param> private static void AsyncObjOperationNameCompleted(int result) { Console.WriteLine($"异步操作完成,结果为: {result}"); } public class MyAsyncClass : Component { /// <summary> /// 声明一个委托类型,用于定义异步操作的方法签名 /// </summary> /// <param name="arg"></param> /// <returns></returns> public delegate void MyAsyncDelegate(int arg); /// <summary> /// 声明一个事件,用于通知异步操作的完成 /// </summary> public event MyAsyncDelegate OperationNameCompleted; /// <summary> /// 异步执行方法,接受一个参数 arg /// </summary> /// <param name="arg"></param> public void DoWorkAsync(int arg) { // 将异步操作放入线程池中执行 ThreadPool.QueueUserWorkItem(new WaitCallback(DoWork), arg); } /// <summary> /// 真正的异步操作 /// </summary> /// <param name="obj"></param> private void DoWork(object obj) { int arg = (int)obj; int res = arg + 1; // 触发事件,传递异步操作的结果 OperationNameCompleted?.Invoke(res); } }