c#中异步编程
異步是現(xiàn)實(shí)生活中的很多現(xiàn)象的一種抽象。比如分工合作在很多時(shí)間段就是異步合作。異步中也一般要涉及委托方法。c#有3種模式的異步編程:異步模式,基于事件的異步模式,基于任務(wù)的異步模式(TAP).
一.??FrameWork 4.0之前的線程世界?
? 在.NET FrameWork 4.0之前,如果我們使用線程。一般有以下幾種方式:
- 使用System.Threading.Thread 類,調(diào)用實(shí)例方法Start()開啟一個(gè)新線程,調(diào)用Abort()方法來提前終止線程。
 - 使用System.Threading.ThreadPool類,調(diào)用靜態(tài)方法QueueUserWorkItem(),將方法放入線程池隊(duì)列,線程池來控制調(diào)用。
 - 使用BeginInvoke,EndInvoke,BeginRead,EnRead,BeginWrite,EndWrite等一系列的異步方法。
 - 使用System.ComponentModel.BackgroundWorker控件,調(diào)用實(shí)例方法RunWorkerAsync(),開啟一個(gè)新線程。
 
二.??.Net 傳統(tǒng)異步編程概述?
- 異步編程模型 (APM),在該模型中異步操作由一對 Begin/End 方法(如 FileStream.BeginRead 和 Stream.EndRead)表示。
 - 基于事件的異步模式 (EAP),在該模式中異步操作由名為“操作名稱Async”和“操作名稱Completed”的方法/事件對(例如 WebClient.DownloadStringAsync 和 WebClient.DownloadStringCompleted)表示。 (EAP 是在 .NET Framework 2.0 版中引入的,在silverlight或者wpf變成中經(jīng)常用到)。
 
三.??Task 的優(yōu)點(diǎn)以及功能???
- 在任務(wù)啟動(dòng)后,可以隨時(shí)以任務(wù)延續(xù)的形式注冊回調(diào)。
 - 通過使用 ContinueWhenAll 和 ContinueWhenAny 方法或者 WaitAll 方法或 WaitAny 方法,協(xié)調(diào)多個(gè)為了響應(yīng) Begin_ 方法而執(zhí)行的操作。
 - 在同一 Task 對象中封裝異步 I/O 綁定和計(jì)算綁定操作。
 - 監(jiān)視 Task 對象的狀態(tài)。
 - 使用 TaskCompletionSource 將操作的狀態(tài)封送到 Task 對象。
 
?第一種 異步模式?
public class 異步調(diào)用 {static void Main(){Console.WriteLine("===== 異步調(diào)用 AsyncInvokeTest =====");AddHandler handler = new AddHandler(加法類.Add);//IAsyncResult: 異步操作接口(interface)//BeginInvoke: 委托(delegate)的一個(gè)異步方法的開始IAsyncResult result = handler.BeginInvoke(1, 2, null, null);Console.WriteLine("繼續(xù)做別的事情。。。");//異步操作返回 EndInvoke方式會(huì)阻塞主線程 需要等待異步線程調(diào)用完畢 才會(huì)執(zhí)行Console.WriteLine(handler.EndInvoke(result));Console.ReadKey();} }?
public class 異步回調(diào) {static void Main(){Console.WriteLine("===== 異步回調(diào) AsyncInvokeTest =====");AddHandler handler = new AddHandler(加法類.Add);//異步操作接口(注意BeginInvoke方法的不同!)IAsyncResult result = handler.BeginInvoke(1,2,new AsyncCallback(回調(diào)函數(shù)),"AsycState:OK");Console.WriteLine("繼續(xù)做別的事情。。。");Console.ReadKey();}static void 回調(diào)函數(shù)(IAsyncResult result){ //result 是“加法類.Add()方法”的返回值//AsyncResult 是IAsyncResult接口的一個(gè)實(shí)現(xiàn)類,空間:System.Runtime.Remoting.Messaging//AsyncDelegate 屬性可以強(qiáng)制轉(zhuǎn)換為用戶定義的委托的實(shí)際類。AddHandler handler = (AddHandler)((AsyncResult)result).AsyncDelegate;//或者 AddHandler handler=result.AsyncState as AddHandler;Console.WriteLine(handler.EndInvoke(result));Console.WriteLine(result.AsyncState);} }利用lambda表達(dá)式簡單寫法 (這個(gè)很常用。一定要理解和學(xué)會(huì)。)
// public delegate string TakesAWhileDelegate(int data1, int data2); 定義一個(gè)委托TakesAWhileDelegate dl = (a, b) => { return (a + b).ToString(); }; //委托 實(shí)例化dl.BeginInvoke(1, 12, result => { //回調(diào)方法 實(shí)例化string str=dl.EndInvoke(result); //EndInvoke方法取回結(jié)果Console.WriteLine("取到異步的結(jié)果了result={0}", str);}, null);第二種 基于事件的異步模式
.net中很多類的方法都定義了同步和異步兩種模式,例如WebClient類,就定義了DownloadStringAsync基于事件的異步模式。
WebClient wc = new WebClient();string strUI = "我是主線程中的元素";wc.Encoding = Encoding.UTF8;//首先實(shí)例化 Completed事件。 注意:可以直接訪問UI線程中的元素// public delegate void DownloadStringCompletedEventHandler(object sender, DownloadStringCompletedEventArgs e);wc.DownloadStringCompleted += (sender1, e1) => { //e1 存放結(jié)果Console.WriteLine(strUI);string str = e1.Result;Console.WriteLine(str);};wc.DownloadStringAsync(new Uri("http://www.baidu.com"));Console.WriteLine("繼續(xù)主線程,不會(huì)因?yàn)樵L問網(wǎng)站而阻塞");第三種 基于任務(wù)的異步模式(Task,await,async關(guān)鍵字)
?
private void button21_Click(object sender, EventArgs e){Console.WriteLine("主線程已經(jīng)開始了");CallerWithAsync(); //調(diào)用基于任務(wù)的異步方法Console.WriteLine("主線程已經(jīng)結(jié)束了");}//創(chuàng)建基于任務(wù)的異步方法private async void CallerWithAsync() {//async(方法修飾符)和await必須成對出現(xiàn)。順序執(zhí)行string result = await GetAsync("第1個(gè)"); //等待 方法執(zhí)行結(jié)果 阻塞線程。編譯器把a(bǔ)wait關(guān)鍵字后的所有代碼放進(jìn)ContinueWith方法的代碼塊中string result2 = await GetAsync("第2個(gè)");Console.WriteLine("任務(wù)第3");}//通過任務(wù)使同步方法異步化private Task<string> GetAsync(string name){ return Task.Run<string>(() => {Thread.Sleep(2000);Console.WriteLine(name);return name; });}
?
?
?
?TASK的用法? ? ?請參考這篇文章?
異步編程新利器
轉(zhuǎn)載于:https://www.cnblogs.com/crhdyl/p/4892311.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
                            
                        - 上一篇: 廊坊银行保证收益型理财产品有哪些?
 - 下一篇: 签署工行“薪金溢5号”协议有风险吗?