多執行緒和非同步

2022-09-17 19:42:10 字數 1846 閱讀 4839

c#中非同步和多執行緒的區別是什麼呢?非同步和多執行緒兩者都可以達到避免呼叫執行緒阻塞的目的,從而提高軟體的可響應性。甚至有些時候我們就認為非同步和多執行緒是等同的概念。但是,非同步和多執行緒還是有一些區別的。而這些區別造成了使用非同步和多執行緒的時機的區別。  

所有的程式最終都會由計算機硬體來執行,所以為了更好的理解非同步操作的本質,我們有必要了解一下它的硬體基礎。 熟悉電腦硬體的朋友肯定對dma這個詞不陌生,硬碟、光碟機的技術規格中都有明確dma的模式指標,其實網絡卡、音效卡、顯示卡也是有dma功能的。dma就是直 接記憶體訪問的意思,也就是說,擁有dma功能的硬體在和記憶體進行資料交換的時候可以不消耗cpu資源。只要cpu在發起資料傳輸時傳送乙個指令,硬體就開 始自己和記憶體交換資料,在傳輸完成之後硬體會觸發乙個中斷來通知操作完成。這些無須消耗cpu時間的i/o操作正是非同步操作的硬體基礎。所以即使在dos 這樣的單程序(而且無線程概念)系統中也同樣可以發起非同步的dma操作。

當進行io bound操作時,非同步會將工作交給執行緒池,這時io工作不會再占用任何cpu資源,直到非同步完成,非同步會通過**的方式通知執行緒池,讓clr響應非同步完成。

執行緒不是乙個計算機硬體的功能,而是作業系統提供的一種邏輯功能,執行緒本質上是程序中一段併發執行的**,所以執行緒需要作業系統投入cpu資源來執行和排程。

因為非同步操作無須額外的執行緒負擔,並且使用**的方式進行處理,在設計良好的情況下,處理函式可以不必使用共享變數(即使無法完全不用,最起碼可以減少 共享變數的數量),減少了死鎖的可能。當然非同步操作也並非完美無暇。編寫非同步操作的複雜程度較高,程式主要使用**方式進行處理,與普通人的思維方式有些出入,而且難以除錯。

多執行緒的優點很明顯,執行緒中的處理程式依然是順序執行,符合普通人的思維習慣,所以程式設計簡單。但是多執行緒的缺點也同樣明顯,執行緒的使用(濫用)會給系統帶來上下文切換的額外負擔。並且執行緒間的共享變數可能造成死鎖的出現。

在了解了執行緒與非同步操作各自的優缺點之後,我們可以來**一下執行緒和非同步的合理用途。我認為:當需要執行i/o操作時,使用非同步操作比使用執行緒+同步 i/o操作更合適。i/o操作不僅包括了直接的檔案、網路的讀寫,還包括資料庫操作、web service、httprequest以及.net remoting等跨程序的呼叫。

而執行緒的適用範圍則是那種需要長時間cpu運算的場合,例如耗時較長的圖形處理和演算法執行。但是往往由於使用執行緒程式設計的簡單和符合習慣,所以很多朋友往往會使用執行緒來執行耗時較長的i/o操作。這樣在只有少數幾個併發操作的時候還無傷大雅,如果需要處理大量的併發操作時就不合適了。

大家可能都知道,使用delegate可以「自動」使乙個方法可以進行非同步的呼叫。從直覺上來說,我覺得是由編譯器或者clr使用了另外的執行緒來執行目標方法。到底是不是這樣呢?

using system;

using system.threading;

namespace 非同步

/// ﹤summary﹥

/// 測試方法,sleep一定時間

/// ﹤/summary﹥

/// ﹤param name="i"﹥sleep的時間﹤/param﹥

static void foo(int i)

/// ﹤summary﹥

/// 投遞乙個非同步呼叫

/// ﹤/summary﹥

static void postasync()

static void main(string args)

console.readline();

}static void foocallback(iasyncresult ar)}}

程式的輸出如下:

看樣子答案是肯定的。

多執行緒和非同步

非同步執行緒 前台執行緒 後台執行緒 預設前台執行緒 有執行緒的取消 完成 失敗通知等互動性操作 通過jion阻塞,達到執行緒執行的先後次序 預設後台執行緒 無線程的取消 完成 失敗通知等互動性操作 可以減少每次建立執行緒的開銷 static void main string args 主線程執行完...

多執行緒和非同步處理

多執行緒 有兩種方式實現多執行緒,一種是繼承thread類,一種是實現runnable介面 繼承thread demo class mythread extends thread override public void run catch interruptedexception e 啟動執行緒 ...

關於多執行緒和非同步

計算密集型工作,採用多執行緒。io密集型工作,採用非同步機制。多執行緒 新開乙個執行緒執行程式 private void btnmutilthread click object sender,eventargs e public void dosomething 非同步執行程式 減少占有cpu dm...