国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

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

異步編程

2019-11-14 13:34:32
字體:
來源:轉載
供稿:網友

概念

說異步前,首先講講這些概念,異步/同步、多線程。

異步:是指呼叫另一操作后,不等待其結果,繼續執行之后的操作,若之后沒有其他操作,當前線程將進入睡眠狀態,而CPU時間將有機會切至其他線程。在異步操作完成后通過回調函數的方式獲取通知與結果。異步的實現方式有多種,如多線程與完成端口。多線程將異步操作放入另一線程中運行,通過輪詢或回調方法得到完成通知;完成端口,由操作系統接管異步操作的調度,通過硬件中斷,在完成時觸發回調方法,此方式不需要占用額外線程。

同步:與異步相對應。

多線程:一般指同一進程中多個線程(包含其數據結構、上下文與代碼片段)協作運行。在多核計算機中多個線程將有機會同時運行于多個核上,如果線程中進行的是計算,則行成并行計算。

.NET中的異步

多線程

概念中提到的用多線程方式實現異步操作,可以使用各種多線程的接口。參照后文中.NET中的多線程。

Classic Async Pattern(CAP) (BeginXXX & EndXXX)

委托(delegate),文件讀寫(FileStream)等等許多的類里面都包含了BeginXXX & EndXXX的異步接口,利用這些接口即可以實現異步編程。但是這個模型里面到底是使用多線程還是完成端口卻取決于具體的實現,委托的(BeginInvoke & EndInvoke)是基于多線程實現。而FileStream要使用完成端口也要傳入FileOptions.Asynchronous提前告訴你將要使用異步IO讀取,否則將會使用默認的多線程實現。

Event-based Async Pattern(EAP)(XXXAsync & XXXComplete)

.NET Framework除了提供上面這種編程模式外,還提供了基于事件的異步編程模式。比如WebClient的很多方法就提供了異步版本,比如DownloadString方法。

同步版本:

public string DownloadString(string url);

異步版本:

public void DownloadStringAsync(string url);

public event DownloadStringCompleteEventHandler DownloadStringComplete;

Task-based Asynchronous Pattern(TAP)(async & await)

以上兩種異步編程模型(CAP & EAP)都將異步實現分成了兩部分:一部分發起異步操作,另一部分獲得結果。如果多個異步需要順序執行的時候,那么就會造成一個異步回調里嵌套另一個異步調用,代碼變得非常混亂。

而TAP就是為了解決這個回調災難的。而且還引入了兩個新的語言關鍵字用于方便用戶編寫異步編程代碼(async & await)。

.NET中的多線程

Thread

托管線程的基礎類。

ThreadPool

內部實現的線程池,循環使用線程,避免線程頻繁的創建,提高效率。

Task

使用內部實現的線程池。更方便的線程創建,異常捕獲,多任務同步。

線程鎖

獨占鎖

Monitor & lock

互斥鎖

Mutex 可以實現跨進程的鎖。

讀寫鎖

ReaderWriterLock,讀寫(Reader-Writer)兩種請求,按照請求到達的順序,一共有四種:
      Reader-Reader,第二個不需等待,直接獲得讀控制權; 
      Reader-Writer,第二個需要等待第一個調用ReleaseReaderLock()釋放讀控制權后,才能獲得寫控制權; 
      Writer-Writer,第二個需要等待第一個調用ReleaseWriterLock()釋放寫控制權后,才能獲得寫控制權; 
      Writer-Reader,第二個需要等待第一個調用ReleaseWriterLock()釋放寫控制權后,才能獲得讀控制權。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 界首市| 吴桥县| 东安县| 通州区| 富川| 日土县| 宣恩县| 新巴尔虎右旗| 隆子县| 沈阳市| 临武县| 汕尾市| 伊宁市| 永宁县| 朝阳区| 阿拉善右旗| 饶平县| 万年县| 永嘉县| 鹤岗市| 柏乡县| 平武县| 乐清市| 舒兰市| 伊宁市| 清涧县| 伊金霍洛旗| 平罗县| 甘泉县| 图木舒克市| 黄梅县| 九龙城区| 故城县| 鄂托克前旗| 汾西县| 龙州县| 安远县| 杂多县| 桓台县| 贺州市| 叶城县|