.NET三种异步模式(APM、EAP、TAP)

APM模式:

.net 1.0时期就提出的一种异步模式,并且基于IAsyncResult接口实现BeginXXX和EndXXX类似的方法。

.net中有很多类实现了该模式(比如HttpWebRequest),同时我们也可以自定义类来实现APM模式(继承IAsyncResult接口并且实现BeginXXX和EndXXX方法)

 1 /// <summary>
 2         /// 异步
 3         /// </summary>
 4         /// <param name="sender"></param>
 5         /// <param name="e"></param>
 6         private void button2_Click(object sender, EventArgs e)
 7         {
 8             //先清空上一次查询结果
 9             this.richTextBox1.Text = "";
10 
11             var url = this.textBox1.Text.Trim();
12             var request = HttpWebRequest.Create(url);
13             request.BeginGetResponse(AsyncCallbackImpl, request);//BeginGetResponse,发起异步请求
14         }
15 
16         /// <summary>
17         /// 回调
18         /// </summary>
19         /// <param name="ar"></param>
20         public void AsyncCallbackImpl(IAsyncResult ar)
21         {
22             HttpWebRequest request = ar.AsyncState as HttpWebRequest;
23             var response = request.EndGetResponse(ar);//EndGetResponse,异步请求完成
24             var stream = response.GetResponseStream();
25             StringBuilder sb = new StringBuilder();
26             sb.AppendLine("当前线程Id:" + Thread.CurrentThread.ManagedThreadId);
27             using (StreamReader reader = new StreamReader(stream))
28             {
29                 var content = reader.ReadLine();
30                 sb.AppendLine(content);
31                 this.richTextBox1.Text = sb.ToString();
32             }
33         }
34   
1 Func<int, int> func = (i) => i + 1;
2             func.BeginInvoke(5, (asyncResult) => {
3                 //Console.WriteLine("call back,param:"+result.AsyncState);
4                 int result = func.EndInvoke(asyncResult);
5                 Console.WriteLine("result:"+ result); 
6             }, null);

EAP模式:

基于事件的异步模式是.net 2.0提出的,实现了基于事件的异步模式的类将具有一个或者多个以Async为后缀的方法和对应的Completed事件,并且这些类都支持异步方法的取消、进度报告和报告结果。然而.net中并不是所有的类都支持EAP。

当调用基于事件的EAP模式的类的XXXAsync方法时,就开始了一个异步操作,并且基于事件的EAP模式是基于APM模式之上的,而APM又是建立在委托之上的。下面的Demo就以BackgroundWorker类来演示如何使用EAP异步。

 1 BackgroundWorker worker = new BackgroundWorker();
 2             worker.DoWork += Worker_DoWork;
 3             worker.RunWorkerCompleted += Worker_RunWorkerCompleted;
 4             worker.RunWorkerAsync(null);
 5 
 6         private static void Worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
 7         {
 8             Console.WriteLine("dowork completed");
 9         }
10 
11         private static void Worker_DoWork(object sender, DoWorkEventArgs e)
12         {
13             Console.WriteLine("dowork");
14         }

TAP模式:

.net 4.0为我们带来了Task的异步,我们有以下三种方法创建Task。

1,Task.Factory.StartNew(),比较常用。

2,Task t1 = new Task(() => { Console.WriteLine("t1 start"); });    t1.Start();

3,Task.Run(),是.net 4.5中增加的。

4,Task.FromResult(),如果结果是已计算,就可以使用这种方法来创建任务。

 1 /// <summary>
 2         /// 使用async/await
 3         /// </summary>
 4         /// <param name="sender"></param>
 5         /// <param name="e"></param>
 6         private async void button5_Click(object sender, EventArgs e)
 7         {
 8             this.richTextBox1.Text = "正在处理请求...";
 9 
10             await DoWorkAsync();
11         }
12 
13         public async Task DoWorkAsync()
14         {
15             var url = this.textBox1.Text.Trim();
16             var request = HttpWebRequest.Create(url);
17             var response = request.GetResponse();
18             var stream = response.GetResponseStream();
19             using (StreamReader reader = new StreamReader(stream))
20             {
21                 var content = reader.ReadToEnd();
22                 this.richTextBox1.Text = content;
23             }
24         }
25   
26   View Code
原文地址:https://www.cnblogs.com/fanfan-90/p/12006157.html