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

2021-05-12 15:30

阅读:455

标签:ati   自定义类   cal   结果   write   syn   manage   actor   继承   

APM模式:

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

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

 1 /// 
 2         /// 异步
 3         /// 
 4         /// 
 5         /// 
 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         /// 
17         /// 回调
18         /// 
19         /// 
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 Funcint, 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 /// 
 2         /// 使用async/await
 3         /// 
 4         /// 
 5         /// 
 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

 

 

 

 

 

 

 

 

 

 

 

 

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

标签:ati   自定义类   cal   结果   write   syn   manage   actor   继承   

原文地址:https://www.cnblogs.com/fanfan-90/p/12006157.html


评论


亲,登录后才可以留言!