非同步編程

来源:http://www.cnblogs.com/binking338/archive/2016/01/08/5113767.html
-Advertisement-
Play Games

說非同步前,首先講講這些概念,非同步/同步、多線程。 非同步:是指呼叫另一操作後,不等待其結果,繼續執行之後的操作,若之後沒有其他操作,當前線程將進入睡眠狀態,而CPU時間將有機會切至其他線程。在非同步操作完成後通過回調函數的方式獲取通知與結果。非同步的實現方式有多種,如多線程與完成埠。多線程將非同步操作放...


概念

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

非同步:是指呼叫另一操作後,不等待其結果,繼續執行之後的操作,若之後沒有其他操作,當前線程將進入睡眠狀態,而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()釋放寫控制權後,才能獲得讀控制權。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、前言 AgileEAS.NET SOA 中間件平臺是一款基於基於敏捷並行開發思想和Microsoft .Net構件(組件)開發技術而構建的一個快速開發應用平臺。用於幫助中小型軟體企業建立一條適合市場快速變化的開發團隊,以達到節省開發成本、縮短開發時間,快速適應市場變化的目的。 AgileEAS....
  • 1. ExcelUtility功能:  1.將數據導出到EXCEL(支持XLS,XLSX,支持多種類型模板,支持列寬自適應)  類名:ExcelUtility. Export  2.將EXCEL數據導入到數據對象中(DataTable、Dataset,支持XLS,XLSX) ...
  • 【實例說明】 本例關鍵點是練習使用^的使用,沒有什麼技術含量,大牛勿噴。呵呵。。 在介紹實例之前先來剪短瞭解一下加密的概念。 加密是指通過某種特殊的方法,更改已有信息的內容,使得未授權的用戶即使得到了加密的信息,如果沒有正確解密的方法,那麼也無法得到信息的內容。 談到加密的話題,一些讀者朋友一定非常...
  • Cron Expressions——Cron 表達式按順序依次為秒(0~59)分鐘(0~59)小時(0~23)天(月)(0~31,但是你需要考慮你月的天數)月(0~11)天(星期)(1~7 1=SUN 或 SUN,MON,TUE,WED,THU,FRI,SAT)7.年份(1970-2099)其中每個...
  • 來源:http://zxlovenet.cnblogs.com聲明:本文原創發表於博客園,作者為初行本文歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則視為侵權。從安裝到配置首先到官網http://www.nunit.org/下載如下圖的資料,安裝NUnit-2.6....
  • 主要介紹一下C#的delegate的用法以及如何實現類似javascript的each方法,並簡要說明delegate,Func, Action和 Predicate的區別
  • 前言最近在幫一家知名外企開發Universal Windows Platform的相關應用,開發過程中不由感慨:項目分為兩種,一種叫做前人栽樹後人乘涼,一種叫做前人挖坑後人遭殃。不多說了,多說又要變成月經貼了。講講MEF。MEF全稱Managed Extensibility Framework。我們...
  • 所謂條件表達式,就是分支語句,去掉分支語句咯1、分解條件表達式修改點:你有一個複雜的條件語句(就是if else語句)做法:將條件表達式的三個部分分別提煉出獨立函數即 if (A部分) { B部分; } ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...