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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/258201.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/258201.shtml
英文地址,請注明出處:http://en.pswp.cn/news/258201.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

《交互式程序設計 第2版》一3.6 關系比較

本節書摘來華章計算機《交互式程序設計 第2版》一書中的第3章 &#xff0c;第3.6節&#xff0c;Joshua Noble 著 毛順兵 張婷婷 陳宇 沈鑫 任燦江 譯更多章節內容可以訪問云棲社區“華章計算機”公眾號查看。 3.6 關系比較 與元組類型類似&#xff0c;關系類型也逃不過“比較運…

mysql 版本更新日志_mysql升級步驟

升級前先請做好數據備份1.解壓tar -zxvf mysql-5.7.9-linux-glibc2.5-x86_64.tar.gz2.關閉mysql5.6.23數據庫 service mysqld stop3.將5.7.9版本放到默認目錄下面mv mysql-5.7.9-linux-glibc2.5-x86_64 /usr/local/mysql4.修改/usr/local/mysql/data 下面的權限chown -R mysql…

C語言中,宏和全局變量的區別是什么?

全局變量 是可以在程序中任何地方使用 而且是可以修改的 宏定義也可以在任何地方使用 但是不能在之后修改 數據類型沒有限制的宏的例子&#xff1a;#define 宏名 宏體 #define PI 3.1415926轉載自&#xff1a; http://zhidao.baidu.com/link?urlDamb48copKtKBsDeugBDIPT7bk…

android 入門-android自定義控件

第一種&#xff1a;繼承View 實現自己的屬性 <com.cc.imagewithmarkersample.MyViewandroid:id"id/myviewid"android:layout_width"wrap_content"android:layout_height"wrap_content"android:layout_centerHorizontal"true"SrcLT&…

Undefined symbols for architecture i386:_OBJC_CLASS_$_xx, referenced from: 解決方法

多個人共同操作同一個項目或拷貝項目時&#xff0c;經常會出現類似這樣的問題&#xff1a; Undefined symbols for architecture i386: "_OBJC_CLASS_$_xx文件名", referenced from: 下面是可能導致這類問題出現的原因及修改&#xff1a; 1.相關工程文件未導入 你可以…

mysql cmake錯誤_MySQL5.5安裝出現CMake錯誤找不到CMakelists.txt原因-阿里云開發者社區...

今天虛擬機上測試安裝 CentOS6.3 PHP5.4.8 MySQL5.5.28&#xff0c;結果搗鼓了半天 MySQL都沒裝上&#xff0c;老是CMake目錄下找不到那個 lists 文件&#xff0c;郁悶的不行&#xff0c;最后發現問題所在&#xff0c;總結在下面(我是把軟件包下載錯了)&#xff1a;1. 檢查參…

node.js Lordofpomelo點擊登錄(login)終端提示成功,頁面不跳轉無反應

firbug查看是因為webserver->public->js->lib->build->build.js文件出錯 打開https://raw.githubusercontent.com/NetEase/lordofpomelo/master/web-server/public/js/lib/build/build.js復制替換build.js即可轉載于:https://www.cnblogs.com/doujinya/p/396616…

LabVIEW設計模式系列——移位寄存器

標準&#xff1a;1、太多移位寄存器會導致連線太多&#xff0c;看起來凌亂&#xff0c;使用簇將變量打包&#xff0c;統一用一個移位寄存器&#xff0c;這樣可以減少連線的麻煩2、如果每個變量都使用一個移位寄存器&#xff0c;沒有一個名字是很難區分移位寄存器到底屬于哪一個…

CA計劃6.14億美元收購安全測試公司Veracode

CA Technologies 將以6.14億美元收購應用安全測試公司Veracode&#xff0c;希望以此拓展其開發和測試產品&#xff0c;更好地為企業和應用開發者服務。該收購案預期將于今年第二季度完成。 Veracode的辦公地點設在伯靈頓、馬薩諸塞和倫敦&#xff0c;是一家雇員超過500人的私營…

MySQL過濾相同binlog_通過Linux命令過濾出binlog中完整的SQL語句

DB&#xff1a;MySQL 5.6.16CentOS&#xff1a;CentOS release 6.3 (Final)當insert語句通過空格跨行輸入的時候&#xff0c;如何提取完整的insert語句&#xff01;創建一個空表&#xff1a;mysql> create table yoon as select * from sakila.actor where 10;Query OK, 0 r…

iOS 獲取當前月份的天數(轉)

在這里我很鄙視百度&#xff0c;尼瑪 竟然每一個我想要的結果。。。最后還是用google弄到的。日前又需要自己以后慢慢研究1. 獲取當前月份有多少天NSCalendar *calendar [NSCalendarcurrentCalendar]; NSRange range [calendarrangeOfUnit:NSDayCalendarUnitinUnit:NSMonthCa…

Dojo中跨域獲取新浪股票接口返回的數據(練習)

首先&#xff0c;配置好環境&#xff0c;不羅嗦了&#xff0c;然后&#xff0c;使用request中的script模塊中的方法&#xff0c;獲取代碼地址為http://hq.sinajs.cn/listsh000001&#xff0c;核心代碼如下&#xff1a; 1 on(dom.byId("clickToShowCode")…

Palo Alto Networks全球化安全堡壘理念 提升企業防御能力

IT領域技術發展日新月異&#xff0c;“軟件服務”的產品模式成功取代硬件成為人們熱議的話題&#xff0c;身處轉變中的安全行業也受到了巨大的影響。面對國內外網絡安全事件頻發&#xff0c;病毒攻擊日益復雜、多元化的現狀&#xff0c;老牌安全廠商是如何應對的呢? 近日&…

●SQL編程

局部變量局部變量必須以 開頭&#xff0c;而且必須先用DECLARE 命令說明后才可使用。使用SELECT 或SET 命令來設定變量的值。說明形式&#xff1a;DECLARE 變量名 變量類型 [ 變量名 變量類型]SELECT 局部變量 變量值SET 局部變量 變量值例&#xff1a;declare name varchar(2…

hdu 1427 速算24點

題目連接 http://acm.hdu.edu.cn/showproblem.php?pid1427 速算24點 Description 速算24點相信絕大多數人都玩過。就是隨機給你四張牌&#xff0c;包括A(1),2,3,4,5,6,7,8,9,10,J(11),Q(12),K(13)。要求只用,-,*,/運算符以及括號改變運算順序&#xff0c;使得最終運算結果為2…

《云計算:概念、技術與架構》一1.1 本書目標

本節書摘來華章計算機《云計算&#xff1a;概念、技術與架構》一書中的第1章 &#xff0c;第1.1節&#xff0c;&#xff08;美&#xff09;Thomas Erl   &#xff08;英&#xff09;Zaigham Mahmood 著 &#xff08;巴西&#xff09;Ricardo Puttini 龔奕利 賀 蓮 胡 創 …

mysql to char 用法_postgresql 中的to_char()常用操作

postgresql中的to_char()用法和Oracle相比&#xff0c;多了一個參數。to_char(待轉換值&#xff0c;轉換格式);常用轉換格式有2種&#xff1a;一個是寫若干個0&#xff0c;如果待轉換的值位數少于于你定義的轉換格式位數&#xff0c;輸出值會自動在左邊補0&#xff0c;位數補齊…

面試題40:數組中只出現一次的數字

題目描述 一個整型數組里除了兩個數字之外&#xff0c;其他的數字都出現了兩次。請寫程序找出這兩個只出現一次的數字。要求時間復雜度是O(n)&#xff0c;空間復雜度是O(1)。 題目分析 劍指Offer&#xff08;紀念版&#xff09;P211 ① 自己與自己異或為0 ② 0與數A異或為A ③ …

Python3 From Zero——{最初的意識:007~函數}

一、編寫可接受任意數量參數的函數&#xff1a;*、** >>> def test(x, *args, y, **kwargs): ... pass ... >>> test(1, 2, 3, 4 ,5 ,5, y9, aa99, bb88,cc900) >>> test(1, 2, 3, 4 ,5 ,5, 9, aa99, bb88,cc900) Traceback (most recent call la…

mysql 數據庫名稱限制_mysql 數據庫名稱限制

mysql 數據庫名稱限制云服務器(Elastic Compute Service&#xff0c;簡稱ECS)是阿里云提供的性能卓越、穩定可靠、彈性擴展的IaaS(Infrastructure as a Service)級別云計算服務。云服務器ECS免去了您采購IT硬件的前期準備&#xff0c;讓您像使用水、電、天然氣等公共資源一樣便…