• .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
  • 相关阅读:
    [Angularjs]$http.post与$.post
    [Bug]Unable to start process dotnet.exe
    [Node.js]Restful Api
    [Node.js]Express web框架
    [Node.js]web模块
    [Winform]使用winform制作远程桌面管理工具
    [Node.js]Domain模块
    [Asp.net web api]缓存
    [Node.js]DNS模块
    WEB传参调用EXE
  • 原文地址:https://www.cnblogs.com/fanfan-90/p/12006157.html
Copyright © 2020-2023  润新知