framework4.0新增類Task 異步模型
2011/8/17 10:27:08
最近在關(guān)注task,從csdn上看到這個(gè),先轉(zhuǎn)了。
在CTP中,增加了新的關(guān)鍵字: async, await。尤其是在SL,WP7的編程中,大量使用異步調(diào)用的環(huán)境里,async, await的確能減少編程的復(fù)雜度。看上去像是同步的方法,其實(shí)編譯器做了些手腳,悄悄的生成了回調(diào)的代碼。比如:
view plain
private async void button_Click(object sender, EventArgs e)
{
var client = new WebClient();
var result = await client.DownloadStringTaskAsync("http://www.csdn.net");
textBox1.Text = result;
MessageBox.Show("Complete");
}
上面的代碼,await 這一行的 DownloadStringTaskAsync (CTP中AsyncCtpLibrary.dll中提供的WebClient的擴(kuò)展方法) 是異步執(zhí)行的,之后兩行被包裝成回調(diào)。
(另外,注意:在button_Click的void之前加上了async關(guān)鍵字)
按照原來的寫法:
view plain
private void button3_Click(object sender, EventArgs e)
{
var client = new WebClient();
client.DownloadStringCompleted += (s, evt) => {
textBox1.Text = evt.Result;
MessageBox.Show("Complete");
};
client.DownloadStringAsync(new Uri("http://www.csdn.net"));
}
比較代碼可以感覺到 async,await 的出現(xiàn),一下把我們從“先定義回調(diào)”的思想變回“同步調(diào)用"的順序時(shí)代。
先回顧一下目前為止我們使用的異步編程方法:
1. 最簡單的Thread:
view plain
var thread = new Thread((obj) =>
{
// 模擬復(fù)雜的處理
Thread.Sleep(1000);
Console.WriteLine(obj);
});
thread.Start("some work");
這種處理方式,麻煩在于處理返回值上,通常還要設(shè)計(jì)個(gè)包裝類封裝個(gè)Result 屬性以獲得返回值。
2. Thread的包裝演變出 APM (Asynchronous Programming Model):
最典型的代表:Delegate.BeginInvoke / EndInvoke。WCF的客戶端代理類如果選擇生成異步方法,那么也是BeginXXX,EndXXX這樣的方法。
view plain
Func<string, string> func = x =>
{
// 模擬復(fù)雜的處理
Thread.Sleep(1000);
return x + " is completed";
};
func.BeginInvoke("some work", ir =>
{
AsyncResult ar = (AsyncResult)ir;
var delegateInstance = (Func<string, string>)ar.AsyncDelegate;
var result = delegateInstance.EndInvoke(ir);
Console.WriteLine(result);
}, null);
3. 基于事件的APM——EAP(Event-based Asynchronous Pattern)
上面的BeginXXX,EndXXX的異步編程模型,在Callback上還是略顯笨重,因此又演變出基于事件注冊回調(diào)方法的模式。
最典型的代表就是 WebClient (HttpWebRequest 等)
view plain
var client = new WebClient();
client.DownloadStringCompleted += (s, evt) => {
textBox1.Text = evt.Result;
MessageBox.Show("Complete");
};
client.DownloadStringAsync(new Uri("http://www.csdn.net"));
4. 基于Task的APM——TAP(Task-based Asynchronous Pattern)
.net 4.0 里引入了并行編程庫,Task成為新的異步編程主角,async, await 語法糖應(yīng)運(yùn)而生。為了實(shí)現(xiàn)async,await編譯器將每個(gè)被async關(guān)鍵字標(biāo)記的方法編譯為一個(gè)方法所在類的一個(gè)內(nèi)嵌類,所有在方法體內(nèi)出現(xiàn)的變量會(huì)被轉(zhuǎn)為這個(gè)類的字段,如果是一個(gè)實(shí)例方法,那么this所代表的對象也被聲明為一個(gè)字段。這個(gè)類有兩個(gè)核心成員:一個(gè)int來保存代碼執(zhí)行到哪一步的 state,一個(gè)方法來執(zhí)行真正的動(dòng)作的 MoveNext() 方法。
比如下面的方法:
下一頁
返回列表
返回首頁
主站蜘蛛池模板:
性欧美大战久久久久久久|
欧美黑人巨大xxxxxxxx|
国产小视频福利|
91视频国产91久久久|
性猛交xxxxx按摩欧美|
久久天天躁狠狠躁夜夜网站|
欧美日本一道高清免费3区|
免费a级毛片永久免费|
老子影院午夜伦不卡手机|
国产成人精品亚洲2020|
49289.com|
夜夜影院未满十八勿进|
不卡一卡二卡三亚洲|
日本娇小xxxⅹhd成人用品|
亚洲乱色伦图片区小说|
波多野结衣之cesd819|
免费高清在线影片一区|
色偷偷人人澡久久天天|
国产女人高潮抽搐叫床视频|
在线观看福利网站|
在线A级毛片无码免费真人|
а√天堂中文最新版地址bt|
成年女人免费碰碰视频|
久久免费观看国产精品|
最近中文电影在线|
亚洲国产精品日韩在线观看|
波多野结衣AV一区二区全免费观看|
动漫人物桶动漫人物免费观看|
试看91福利区体验区120秒|
国产成人久久精品|
天天影视色香欲性综合网网站|
国产精品自在欧美一区|
99re热久久这里只有精品首页|
女神们的丝袜脚战争h|
一道本在线观看视频|
无码人妻一区二区三区在线|
久久国产一区二区三区|
最近中文字幕完整在线电影|
亚洲国产天堂久久综合|
欧美最猛性xxxxx免费|
亚洲精品在线不卡|