.NET三种异步模式(APM、EAP、TAP)
.net 1.0时期就提出的一种异步模式,并且基于IAsyncResult接口实现BeginXXX和EndXXX类似的方法。
.net中有很多类实现了该模式(比如HttpWebRequest),同时我们也可以自定义类来实现APM模式(继承IAsyncResult接口并且实现BeginXXX和EndXXX方法)
1 /// <summary>
2
/// 异步
3
/// </summary>
4
/// <param></param>
5
/// <param></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></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,如果结果是已计算,就可以使用这种方法来创建任务。
温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/web/41137.html
- 上一篇:网页添加音乐视频方式
- 下一篇:node.js技术文章汇总