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免费| 亚洲精品在线不卡|