- 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);
- }
3、Asynchronous Programming Model(APM模式)
是一种经典的异步编程模式,需要手动创建回调函数,用于处理完成或错误的通知。可以通过 IAsyncResult 设计模式的 Begin 和 End 方法来实现,其中 Begin 方法开始异步操作,而 End 方法在异步操作完成时执行,并返回异步操作的结果。
需要注意的是,APM 模式通过 IAsyncResult 接口来存储异步操作的状态和结果,相对比较复杂,代码量也较大。同时,在使用 APM 模式时,还需要手动处理回调函数和等待异步操作完成等细节工作,使得开发起来相对较为繁琐。
4、Event-based Asynchronous Pattern(EAP模式)
一种已过时的异步编程模式,需要使用事件来实现异步编程。例如:
需要注意的是,EAP 模式通过事件来实现异步编程,相对于 APM 模式更加简洁易懂,同时也避免了手动处理回调函数等细节工作。但是,EAP 模式并不支持 async/await 异步关键字,因此在一些特定的场景下可能不够灵活。
- public class MyAsyncClass : Component
- {
- /// <summary>
- /// 声明一个委托类型,用于定义异步操作的方法签名
- /// </summary>
- /// <param name="arg"></param>
- /// <returns></returns>
- public delegate int 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);
- }
- }
参考文章
https://learn.microsoft.com/zh-cn/dotnet/standard/asynchronous-programming-patterns/