從C 5 0說起 再次總結C 非同步呼叫方法發展史

2021-09-06 08:53:16 字數 4442 閱讀 7635

c#發展至今,已經從最初的1.0到了5.0版本,其進化史如下,參考了c# 5.0 in a nutshel:

讓我們來回顧一下各個版本都帶來了什麼:

1.0版本 - 基本c#語法。

2.0版本 - 泛型的支援,clr進行了公升級,從根本上支援了執行時泛型。

3.0版本 - linq,新增了from/join等類sql關鍵字,新增了擴充套件函式,新增了編譯期動態型別var關鍵字。

4.0版本 - dynamic關鍵字,clr進行公升級,加入dlr,開始對動態進行友好的支援。同時加入動態引數、引數預設值、泛型協變等特性。

5.0版本-新的非同步模型,新增了async/await等關鍵字,簡化平行計算parallel。

可以看出作為程式語言的c#已經非常強大,單隨著時代的發展,c#依然在不斷的前進。每一代的c#都會在語法的調整之,外帶來乙個新特性。從2.0的泛型、3.0的linq、4.0的dynamic到5.0的async非同步,每個版本的c#都有乙個主導的思想,而其他細節的改進和調整則是圍繞著這個主導思想給予支援。

下面我們來看下c#5.0及之前版本,非同步呼叫方法的各種實現方法。

首先我們來看乙個普通的同步方法,如下:

using

system;

using

system.net;

namespace

noasync

static

void showuricontent(string

uri)

}static

void display(string

text)}}

同步方法會造成執行緒的阻塞。

因此我們有了非同步的方法,最早期的非同步方法時begin/end模式(其實現方法一共有四種,請參考debuglzq前面的博文:.net非同步程式設計總結----四種實現模式)。

using

system;

using

system.threading;

using

system.net;

namespace

asybeginendnoencapsulation

//------進行非同步封裝

public

delegate

void showuricontentdelegate(string

text);

static

void showuricontentasync(string

uri)

static

void

showuricontentcompleted(iasyncresult result)

//------原同步方法

static

void showuricontent(string

uri)

}static

void display(string

text)}}

最原始的封裝就是這個樣子。

可以利用c#新特性,如action/function、匿名方法、lambda表示式等,簡寫(合寫)如下:

using

system;

//using system.collections.generic;

//using system.linq;

//using system.text;

using

system.threading;

using

system.net;

namespace

asybeginendnoencapsulationsimply

//------進行非同步封裝

public

delegate

void showuricontentdelegate(string

text);

static

void showuricontentasync(string

uri)

static

void

showuricontentcompleted(iasyncresult result)

//------進行非同步封裝--簡化1:action簡化

static

void showuricontentasync1(string

uri)

static

void

showuricontentcompleted1(iasyncresult result)

//------簡化2:匿名方法簡化

static

void showuricontentasync2(string

uri)

};showuricontentdelegate.begininvoke(uri,

delegate(iasyncresult result) , showuricontentdelegate);

}//------簡化3:lambda簡化

static

void showuricontentasync3(string

uri)

};showuricontentdelegate.begininvoke(uri, (result) => , showuricontentdelegate);

}

//---------------------原同步方法

static

void showuricontent(string

uri)

}static

void display(string

text)}}

以上是我們最原始的實現方法,及利用新特性的各種變種寫法。

但是webclient作為webrequest的高層封裝,.net已經幫我們把這個非同步模式給封裝了(也就是說有些同步方法不需要我們自己進行封裝了)。

因此我們也可以如下:

using

system;

using

system.threading;

using

system.net;

namespace

asyncbeginendencapsulation

static

void showuricontent(string

uri)

}static

void display(object

sender, downloadstringcompletedeventargs e)

//-------簡化的寫法

static

void showuricontent2(string

uri)

;client.downloadstringasync(

newuri(uri));}}

}}

從上面.net對begin/end模式的主動封裝可以看出,其目的是為了簡化非同步方法的呼叫,最終的目的是讓非同步方法呼叫像我們最熟悉的同步方法呼叫那麼簡單。

c#5.0引入了兩個關鍵字async、await以提供一種更為簡潔的非同步方法呼叫模式。

我們實現如下(控制台入口點main方法無法標記為async,因此我們用winform程式演示):

using

system;

using

system.windows.forms;

using

system.net;

namespace

asyncawaitwinform

private

async

void button1_click(object

sender, eventargs e)

//async

task

showuricontentasyncawait(string

uri)

} }}

需要說明的是async、await需要:visual studio 2010 + sp1+visual studio async ctp,或是visual studio 2012.

update: 關於 parallel---task,請參考debuglzq後續博文:task and parallel

以上所有示例程式均由debuglzq動手編寫,可以正常執行,其結果顯而易見,因此沒有附上執行截圖。

把自己的理解分享給大家,共同交流進步,認識不斷提公升~

update: read more

difference between delegate.begininvoke and thread.start

differences in the different ways to make concurrent programs

C 非同步呼叫

在做乙個winform列印條碼應用的時候碰到乙個問題,在條碼列印方法中迴圈列印,由於需要列印的數量比較多,這時候就導致當點選列印的時候整個應用程式就死在那裡不動了,一直到列印結束之後才會有反應.查了點資料,下面是非同步呼叫的方法 1.通過非同步呼叫,在列印方法中通過委託呼叫執行時間比較長的方法 假如...

C 非同步同步呼叫

本文將主要通過 同步呼叫 非同步呼叫 非同步 三個示例來講解在用委託執行同乙個 加法類 的時候的的區別和利弊。首先,通過 定義乙個委託和下面三個示例將要呼叫的方法 新增的命名空間 using system.threading using system.runtime.remoting.messagi...

C 委託非同步呼叫

廢話不多說,直接上 ps 我就喜歡簡單 直接 粗暴 using system using system.collections.generic using system.linq using system.runtime.remoting.messaging using system.text us...