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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

c#中异步编程

發布時間:2023/12/13 C# 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c#中异步编程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

異步是現實生活中的很多現象的一種抽象。比如分工合作在很多時間段就是異步合作。異步中也一般要涉及委托方法。c#有3種模式的異步編程:異步模式,基于事件的異步模式,基于任務的異步模式(TAP).

一.??FrameWork 4.0之前的線程世界?   

  ? 在.NET FrameWork 4.0之前,如果我們使用線程。一般有以下幾種方式:

  • 使用System.Threading.Thread 類,調用實例方法Start()開啟一個新線程,調用Abort()方法來提前終止線程。
  • 使用System.Threading.ThreadPool類,調用靜態方法QueueUserWorkItem(),將方法放入線程池隊列,線程池來控制調用。
  • 使用BeginInvoke,EndInvoke,BeginRead,EnRead,BeginWrite,EndWrite等一系列的異步方法。
  • 使用System.ComponentModel.BackgroundWorker控件,調用實例方法RunWorkerAsync(),開啟一個新線程。 

二.??.Net 傳統異步編程概述?

  • 異步編程模型 (APM),在該模型中異步操作由一對 Begin/End 方法(如 FileStream.BeginRead 和 Stream.EndRead)表示。
  • 基于事件的異步模式 (EAP),在該模式中異步操作由名為“操作名稱Async”和“操作名稱Completed”的方法/事件對(例如 WebClient.DownloadStringAsync 和 WebClient.DownloadStringCompleted)表示。 (EAP 是在 .NET Framework 2.0 版中引入的,在silverlight或者wpf變成中經常用到)。

三.??Task 的優點以及功能???

  • 在任務啟動后,可以隨時以任務延續的形式注冊回調。
  • 通過使用 ContinueWhenAll 和 ContinueWhenAny 方法或者 WaitAll 方法或 WaitAny 方法,協調多個為了響應 Begin_ 方法而執行的操作。
  • 在同一 Task 對象中封裝異步 I/O 綁定和計算綁定操作。
  • 監視 Task 對象的狀態。
  • 使用 TaskCompletionSource 將操作的狀態封送到 Task 對象。

?第一種 異步模式?

public class 異步調用 {static void Main(){Console.WriteLine("===== 異步調用 AsyncInvokeTest =====");AddHandler handler = new AddHandler(加法類.Add);//IAsyncResult: 異步操作接口(interface)//BeginInvoke: 委托(delegate)的一個異步方法的開始IAsyncResult result = handler.BeginInvoke(1, 2, null, null);Console.WriteLine("繼續做別的事情。。。");//異步操作返回 EndInvoke方式會阻塞主線程 需要等待異步線程調用完畢 才會執行Console.WriteLine(handler.EndInvoke(result));Console.ReadKey();} }

?

public class 異步回調 {static void Main(){Console.WriteLine("===== 異步回調 AsyncInvokeTest =====");AddHandler handler = new AddHandler(加法類.Add);//異步操作接口(注意BeginInvoke方法的不同!)IAsyncResult result = handler.BeginInvoke(1,2,new AsyncCallback(回調函數),"AsycState:OK");Console.WriteLine("繼續做別的事情。。。");Console.ReadKey();}static void 回調函數(IAsyncResult result){ //result 是“加法類.Add()方法”的返回值//AsyncResult 是IAsyncResult接口的一個實現類,空間:System.Runtime.Remoting.Messaging//AsyncDelegate 屬性可以強制轉換為用戶定義的委托的實際類。AddHandler handler = (AddHandler)((AsyncResult)result).AsyncDelegate;//或者 AddHandler handler=result.AsyncState as AddHandler;Console.WriteLine(handler.EndInvoke(result));Console.WriteLine(result.AsyncState);} }

利用lambda表達式簡單寫法 (這個很常用。一定要理解和學會。)

// public delegate string TakesAWhileDelegate(int data1, int data2); 定義一個委托TakesAWhileDelegate dl = (a, b) => { return (a + b).ToString(); }; //委托 實例化dl.BeginInvoke(1, 12, result => { //回調方法 實例化string str=dl.EndInvoke(result); //EndInvoke方法取回結果Console.WriteLine("取到異步的結果了result={0}", str);}, null);

第二種 基于事件的異步模式

.net中很多類的方法都定義了同步和異步兩種模式,例如WebClient類,就定義了DownloadStringAsync基于事件的異步模式。

WebClient wc = new WebClient();string strUI = "我是主線程中的元素";wc.Encoding = Encoding.UTF8;//首先實例化 Completed事件。 注意:可以直接訪問UI線程中的元素// public delegate void DownloadStringCompletedEventHandler(object sender, DownloadStringCompletedEventArgs e);wc.DownloadStringCompleted += (sender1, e1) => { //e1 存放結果Console.WriteLine(strUI);string str = e1.Result;Console.WriteLine(str);};wc.DownloadStringAsync(new Uri("http://www.baidu.com"));Console.WriteLine("繼續主線程,不會因為訪問網站而阻塞");

第三種 基于任務的異步模式(Task,await,async關鍵字)

?

private void button21_Click(object sender, EventArgs e){Console.WriteLine("主線程已經開始了");CallerWithAsync(); //調用基于任務的異步方法Console.WriteLine("主線程已經結束了");}//創建基于任務的異步方法private async void CallerWithAsync() {//async(方法修飾符)和await必須成對出現。順序執行string result = await GetAsync("第1個"); //等待 方法執行結果 阻塞線程。編譯器把await關鍵字后的所有代碼放進ContinueWith方法的代碼塊中string result2 = await GetAsync("第2個");Console.WriteLine("任務第3");}//通過任務使同步方法異步化private Task<string> GetAsync(string name){ return Task.Run<string>(() => {Thread.Sleep(2000);Console.WriteLine(name);return name; });}

  

?

?

?

  

?TASK的用法? ? ?請參考這篇文章?

異步編程新利器

轉載于:https://www.cnblogs.com/crhdyl/p/4892311.html

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的c#中异步编程的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。