日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > C# >内容正文

C#

【转】1:C#的三种异步的详细介绍及实现

發(fā)布時(shí)間:2023/12/10 C# 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【转】1:C#的三种异步的详细介绍及实现 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、介紹異步的前世今生:

  • 異步編程模型 (APM,Asynchronous Programming Model) 模式(也稱(chēng) IAsyncResult 模式),在此模式中異步操作需要 Begin 和 End 方法(比如用于異步寫(xiě)入操作的 BeginWrite 和 EndWrite)。 對(duì)于新的開(kāi)發(fā)工作不再建議采用此模式
  • 基于事件的異步模式 (EAP,Event-based Asynchronous Pattern),這種模式需要 Async 后綴,也需要一個(gè)或多個(gè)事件、事件處理程序委托類(lèi)型和 EventArg 派生類(lèi)型。 EAP 是在 .NET Framework 2.0 中引入的。 對(duì)于新的開(kāi)發(fā)工作不再建議采用此模式。
  • 基于任務(wù)的異步模式 (TAP, Task-based Asynchronous Pattern) 使用一種方法來(lái)表示異步操作的啟動(dòng)和完成。 TAP 是在 .NET Framework 4 中引入的,并且它是在 .NET Framework 中進(jìn)行異步編程的推薦使用方法。 C# 中的 async 和 await 關(guān)鍵詞以及 Visual Basic 語(yǔ)言中的 Async 和 Await 運(yùn)算符為 TAP 添加了語(yǔ)言支持。

?

二、我這里以一個(gè)Read方法為例,將異步操作簡(jiǎn)單進(jìn)行講解:

1.普通操作類(lèi)

public class MyClass {public int Read(byte [] buffer, int offset, int count); }

?

2.異步編程模型(APM)

APM(Asynchronous Programming Model)是.Net 舊版本中廣泛使用的異步編程模型。使用了 APM 的異步方法會(huì)返回一個(gè) IAsyncResult 對(duì)象,這個(gè)對(duì)象有一個(gè)重要的屬性 AsyncWaitHandle,他是一個(gè) 用來(lái)等待異步任務(wù)執(zhí)行結(jié)束的一個(gè)同步信號(hào)。?如果不加 aResult.AsyncWaitHandle.WaitOne() 那么很有可能打印出空白,因?yàn)?BeginRead 只是“開(kāi)始讀取”。調(diào)用完成一般要調(diào)用 EndXXX 來(lái)回收資源。 ?APM 的特點(diǎn)是:方法名字以 BeginXXX 開(kāi)頭,返回類(lèi)型為 IAsyncResult,調(diào)用結(jié)束后需要 EndXXX。 ?.Net 中有如下的常用類(lèi)支持 APM:Stream、SqlCommand、Socket 等。 ?APM 還是太復(fù)雜,了解即可。?

public class MyClass {public IAsyncResult BeginRead(byte [] buffer, int offset, int count,AsyncCallback callback, object state);public int EndRead(IAsyncResult asyncResult); }

?

3.基于事件的異步模式(EAP)

類(lèi)似于 Ajax 中的 XmlHttpRequest,send 之后并不是處理完成了,而是在 onreadystatechange 事件中再通知處理完成。

優(yōu)點(diǎn)是簡(jiǎn)單,缺點(diǎn)是當(dāng)實(shí)現(xiàn)復(fù)雜的業(yè)務(wù)的時(shí)候很麻煩,比如下載 A 成功后再下載 b,如果下載 b 成功再下載 c,否則就下載 d。

EAP 的類(lèi)的特點(diǎn)是:一個(gè)異步方法配一個(gè)***Completed 事件。.Net 中基于 EAP 的類(lèi)比較少。也有更 好的替代品,因此了解即可。

public class MyClass {public void ReadAsync(byte [] buffer, int offset, int count);public event ReadCompletedEventHandler ReadCompleted; }

?

4.基于任務(wù)的異步模式(TAP)

public class MyClass {public Task<int> ReadAsync(byte [] buffer, int offset, int count); }

?

、我這里以一個(gè)下載資料方法為例,將異步操作簡(jiǎn)單進(jìn)行講解:

1.普通同步操作

private void btn_Click(object sender, EventArgs e)//這是同步按鈕{using (WebClient wc = new WebClient()){// 我們嘗試去下載 python 的安裝包。wc.DownloadFile("https://file.aaoit.com/upload/AllLearnFile/admin//2018/4/24/c558f2dc9d6310bfe3cd1788094d3f0c.pdf", "C#課程第一單元學(xué)習(xí).pdf");}label1.ForeColor = Color.Blue;label1.Text = "下載完成。";//提示的label}

2.基于事件的異步模式(EAP)

private void btnEAP_Click(object sender, EventArgs e)//這是EAP按鈕{using (WebClient wc = new WebClient()){// 我們嘗試去下載 python 的安裝包。// 下載完成時(shí)會(huì)有事件通知。wc.DownloadFileCompleted += Wc_DownloadFileCompleted;wc.DownloadFileAsync(new Uri("https://file.aaoit.com/upload/AllLearnFile/admin//2018/4/24/c558f2dc9d6310bfe3cd1788094d3f0c.pdf"), "C#課程第一單元學(xué)習(xí)EAP.pdf");}}private void Wc_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e){label1.ForeColor = Color.Yellow;label1.Text = "下載完成。";//提示的label}

?

3.異步編程模型(APM)

private void btnAPM_Click(object sender, EventArgs e)//這是APM按鈕{FileStream fs = File.OpenRead("e:/cc.txt"); byte[] buffer = new byte[16]; IAsyncResult aResult = fs.BeginRead(buffer, 0, buffer.Length, null, null); aResult.AsyncWaitHandle.WaitOne();//等待任務(wù)執(zhí)行結(jié)束 MessageBox.Show(Encoding.UTF8.GetString(buffer));fs.EndRead(aResult); }

?

4.基于任務(wù)的異步模式(TAP)

private async void btnTAP_Click(object sender, EventArgs e)//這是TAP按鈕{using (WebClient wc = new WebClient()){// 我們嘗試去下載 python 的安裝包。Task task = wc.DownloadFileTaskAsync("https://file.aaoit.com/upload/AllLearnFile/admin//2018/4/24/c558f2dc9d6310bfe3cd1788094d3f0c.pdf", "C#課程第一單元學(xué)習(xí)TAP.pdf");// 可以在這里執(zhí)行代碼。await task;}label1.ForeColor = Color.Red;label1.Text = "下載完成。";//提示的label}

?

?

四、TPL(Task Parallel Library)是.Net 4.0 之后帶來(lái)的新特性,更簡(jiǎn)潔,更方便?,F(xiàn)在在.Net 平臺(tái)下已經(jīng)大面積使用。

TPL即任務(wù)并行庫(kù),是.NET Framework?4版本中的新鮮物,是System.Threading 和 System.Threading.Tasks 命名空間中的一組公共類(lèi)型和 API。TPL 的目的在于簡(jiǎn)化向應(yīng)用程序中添加并行性和并發(fā)性的過(guò)程,從而提高開(kāi)發(fā)人員的工作效率。?TPL 會(huì)動(dòng)態(tài)地按比例調(diào)節(jié)并發(fā)程度,以便最有效地使用所有可用的處理器。此外,TPL 還處理工作分區(qū)、ThreadPool?上的線(xiàn)程調(diào)度、取消支持、狀態(tài)管理以及其他低級(jí)別的細(xì)節(jié)操作。通過(guò)使用 TPL,您可以在將精力集中于程序要完成的工作,同時(shí)最大程度地提高代碼的性能。

1.實(shí)現(xiàn)讀取txt

private async void btnTPL_Click(object sender, EventArgs e)//這是TPL按鈕{FileStream fs = File.OpenRead("e:/cc.txt");byte[] buffer = new byte[16];int len = await fs.ReadAsync(buffer, 0, buffer.Length);MessageBox.Show("讀取了" + len + "個(gè)字節(jié)");MessageBox.Show(Encoding.UTF8.GetString(buffer)); }

注意方法中如果有 await,則方法必須標(biāo)記為 async,不是所有方法都可以被輕松的標(biāo)記 為 async。WinForm 中的事件處理方法都可以標(biāo)記為 async、MVC 中的 Action 方法也可以標(biāo) 記為 async、控制臺(tái)的 Main 方法不能標(biāo)記為 async。 ?TPL 的特點(diǎn)是:方法都以 XXXAsync 結(jié)尾,返回值類(lèi)型是泛型的 Task<T>。 ?TPL 讓我們可以用線(xiàn)性的方式去編寫(xiě)異步程序,不再需要像 EAP 中那樣搞一堆回調(diào)、邏 輯跳來(lái)跳去了。await 現(xiàn)在已經(jīng)被 JavaScript 借鑒走了! ?用 await 實(shí)現(xiàn)“先下載 A,如果下載的內(nèi)容長(zhǎng)度大于 100 則下載 B,否則下載 C”就很容易了 。

2.?WebClient 的 TPL 用法:?

?

private async void btnTPLWebClientNo_Click(object sender, EventArgs e)//這是TPLUI不卡死按鈕{WebClient wc = new WebClient();string html = await wc.DownloadStringTaskAsync("https://www.aaoit.com");//不要丟了 await MessageBox.Show(html); }private void btnTPLWebClientYES_Click(object sender, EventArgs e)//這是TPLUI卡死按鈕{WebClient wc = new WebClient();var task = wc.DownloadStringTaskAsync("https://www.aaoit.com"); task.Wait(); MessageBox.Show(task.Result); }

WebClient、Stream、Socket 等這些“歷史悠久”的類(lèi)都同時(shí)提供了 APM、TPL 風(fēng)格的 API,甚至有的還提供了 EAP 風(fēng)格的 API。盡可能使用 TPL 風(fēng)格的。?

總結(jié)

以上是生活随笔為你收集整理的【转】1:C#的三种异步的详细介绍及实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。