麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學院 > 開發設計 > 正文

[.net 面向對象程序設計進階] (19) 異步(Asynchronous) 使用異步創建快速響應和可伸縮性的應用程序

2019-11-17 02:13:12
字體:
來源:轉載
供稿:網友

[.net 面向對象程序設計進階] (19) 異步(Asynchronous) 使用異步創建快速響應和可伸縮性的應用程序

[.net 面向對象程序設計進階] (19) 異步(Asynchronous) 使用異步創建快速響應和可伸縮性的應用程序

本節導讀:

本節主要說明使用異步進行程序設計的優缺點及如何通過異步編程.

使用傳統方法BeginInvoke/EndInvoke來實現異步。

使用async/await創建異步方法和事件。

通過異步編程創建具有快速響應和可伸縮性的應用程序。

讀前必備:

A.委托[.net面向對象編程基礎](21)委托

B.事件[.net面向對象編程基礎] (22)事件

1.異步程序設計的優缺點:

A.讓用戶界面快速響應;對于耗時操作阻塞UI線程,通過異步回調可使用UI快速響應。

B.創建高伸縮性的應用。對于服務端應用,創建更多線程來處理消耗資源較多,使用異步可使用主線程繼續工作,不需要等待返回。使用程序具有更好的伸縮性。

對于異步的缺點,最主要一點就是比創建同步程序難度大一些,首先使用傳統的方法創建異步,比起同步更容易出錯。不過隨著.NET的不斷發展和第三方異步組件的豐富,創建異步應用程序也變得越來越簡單了。

2.異步的實現

對于.NET中的異步編程,.NET在各個方向都幾乎提供了同步和異步的兩個方式來實現,在這里我們不能把.NET中全部的異步編程方法都列舉出來了,下面介紹幾種常用且實用的異步方法。

3.使用BeginInvoke/EndInvoke實現異步

3.1簡單的異步示例

下面看一個簡單的示例:

//使用一個有返回值的泛型委托來執行BeginInvokeFunc<string> myFunc = new Func<string>(()=>{    Thread.Sleep(10);    return "我是異步執行完成的返回值 當前時間:" + System.DateTime.Now.ToString();});IAsyncResult asynResult = myFunc.BeginInvoke(null, null);//在異步沒有完成前,可以做別的事while (!asynResult.IsCompleted){    //當不是true時,就執行這里的代碼    Console.WriteLine("當前異步是否完成:" + asynResult.IsCompleted + " 當前時間:" + System.DateTime.Now.ToString());}string result = myFunc.EndInvoke(asynResult);//當是true時,就將結果返回顯示Console.WriteLine(result);

運行結果如下:

在異步沒有完成時,可以繼續工作做一些想做的事,異步完成后返回結果。

3.2使用異步的超時WaitOne判斷異步完成

除了上面使用IsCompleted來判斷異步完成之外,也可以使用超時來判斷異步的完成情況

示例如下:

//使用一個有返回值的泛型委托來執行BeginInvokeFunc<string> myFunc = new Func<string>(()=>{    int i = 0;    while (i<99999999)        ++i;    return "異步執行完成的返回值" + (i).ToString() + " 當前時間:" + System.DateTime.Now.ToString();   });IAsyncResult asynResult = myFunc.BeginInvoke(null, null);while (!asynResult.AsyncWaitHandle.WaitOne(10, false))    Console.Write("*");string result = myFunc.EndInvoke(asynResult);Console.Write("/n");Console.WriteLine(result);

運行結果如下:

3.3回調

畢竟上述兩種等待不是一個好的方法。我們在前端開發中使用過Ajax的同學肯定知道,前端中異步使用一個回調函數在異步完成后完成我們想要做的事,.NET自然也有類似的回調方法,

看示例:

           //使用一個有返回值的泛型委托來執行BeginInvokeFunc<string> myFunc = new Func<string>(()=>{    int i = 0;    while (i<99999999)        ++i;    return "異步執行完成的返回值" + (i).ToString() + " 當前時間:" + System.DateTime.Now.ToString();   });IAsyncResult asynResult = myFunc.BeginInvoke((result) =>{    string rst = myFunc.EndInvoke(result);    Console.WriteLine("異步完成了,我該返回結果了!");    Console.WriteLine(rst);}, null);

運行結果如下 :

3.4 其它組件中的Begin/End異步方法

除了BeginInvoke/EndInvoke之外,.NET在很多類中提供了異步的方法,

如System.Net.HttpWebRequest類的BeginGetResponse和EndGetResponse方法,

這里不再一一列舉了,使用方法和上面的示例類似。

4. async/await

.NET5.0以后,讓異步編程變得更加簡單了,我們介紹一下async和await。

它讓我們編寫異步程序變得和同步一樣簡單,不但減少了代碼量,而且不會因為異步讓我們程序邏輯被打亂。

4.1異步方法

下面使用async和await關鍵字來創建一個異步方法,

在第一個方法里調用第二個異步方法,

第二個異步方法中使用了多線程。

聽起來很繞口,不過整個代碼編寫和同步方法沒有什么區別,只是多一個關鍵字。

static void Main(string[] args){    Console.WriteLine("主線程開始..");    AsyncMethod();    Thread.Sleep(1000);    Console.WriteLine("主線程結束..");    Console.ReadKey();}static async void AsyncMethod(){    Console.WriteLine("開始異步方法");    var result = await MyMethod();    Console.WriteLine("異步方法結束");}static async Task<int> MyMethod(){    for (int i = 0; i < 5; i++)    {        Console.WriteLine("異步執行" + i.ToString() + "..");        await Task.Delay(1000); //模擬耗時操作    }    return 0;}

運行結果如下:

4.2異步事件

下面使用一個WinForm應用程序來測試一下異步事件,我們創建一個同步的Click事件和一個異步的Click事件,先觸發異步,然后緊接著觸發同步,看一下運行結果。

//同步事件PRivate void button2_Click(object sender, EventArgs e){    textBox1.Text += "同步執行開始../r/n";              MyMethodFirst();    textBox1.Text += "同步執行結束../r/n";          }//同事事件調用方法int MyMethodFirst(){    for (int i = 0; i < 5; i++)    {        textBox1.Text += "同步執行" + i.ToString() + "../r/n";                   }    return 0;}//異步事件private async  void button3_Click(object sender, EventArgs e){    textBox1.Text += "異步執行開始..====/r/n";    await MyMethodSencond();    textBox1.Text += "異步執行結束..====/r/n";     }//異步事件調用方法async Task<int> MyMethodSencond(){    for (int i = 0; i < 5; i++)    {        textBox1.Text += "異步執行" + i.ToString() +" ..====/r/n";                  await Task.Delay(1000); //模擬耗時操作    }    return 0;}

運行結果如下:

5. 本節要點

A.使用傳統方法BeginInvoke/EndInvoke來實現異步

B.使用async/await創建異步方法和事件

==============================================================================================

返回目錄

<如果對你有幫助,記得點一下推薦哦,如有有不明白或錯誤之處,請多交流>

<對本系列文章閱讀有困難的朋友,請先看《.net 面向對象編程基礎》>

<轉載聲明:技術需要共享精神,歡迎轉載本博客中的文章,但請注明版權及URL>

.NET 技術交流群:467189533 .NET 程序設計

==============================================================================================


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 大学生a级毛片免费视频 | 国产一区二区久久精品 | 中文字幕精品在线视频 | 草莓福利社区在线 | 91在线精品亚洲一区二区 | 欧美一级无毛 | 欧美在线小视频 | 久久精品com| 国产精品亚洲yourport | 成人在线免费观看小视频 | 欧日一级片 | 黄色毛片视频在线观看 | 日日碰日日操 | 欧美精品18| 久久久综合视频 | 免费a观看| 欧美日韩在线播放一区 | 欧洲精品色 | xxx18hd18hd日本| 欧美片a | 中文日韩| 成人毛片av在线 | 色视频欧美 | 日韩一级片免费 | 久久久久久久久成人 | 欧美日韩一 | 国产亚洲美女精品久久久2020 | 免费男女视频 | 亚洲免费资源 | 欧美成人三级大全 | 国产女同玩人妖 | 噜噜噜躁狠狠躁狠狠精品视频 | 国产精品美女久久久久久不卡 | 国产女厕一区二区三区在线视 | 国产电影av在线 | 99精品视频免费 | 国产一区视频在线观看免费 | 麻豆国产网站 | 日本精品免费观看 | 欧美一级黑人 | 久久久国产精品视频 |