非同步編程出現已經很早了,微軟在silverlight中的(RIA Service)將這個發揮到了極致,其實就是只提供非同步遠程服務調用,說起來也是非常美好的事情,但實際上卻未必如此美好,因為很多應用,特別是帶有業務性質的,都需要一定程度上的同步,在這種情況下如果用非同步編程就會非常的複雜,需要用非同步類比同步,這個工作量是非常大的,特別是在商務邏輯比較複雜的情況下,需要調用一系列非同步方法呼叫來組合,而調用在業務上要求有先後的情況下,就是一個災難,非常複雜,而且代碼的可讀性和維護性極差(用silverlight做過公司專屬應用程式的應該能體會那種痛苦),當然非同步編程由於其處理方式比起同步編程來講,對程式員的要求要高很多.微軟顯然是認識到了這個問題,於是在新的C#版本中弄出了async和await關鍵字,來簡化非同步下的同步類比,下面的代碼是我進行測試的代碼(抄CSDN今天頭條中非同步編程中的):
private static async Task<string> GetContent(string url) { WebRequest wr = WebRequest.Create(url); //var rsp = wr.GetResponse(); //var stm1 = rsp.GetResponseStream(); var response = await wr.GetResponseAsync(); using (var stm = response.GetResponseStream()) { using (var reader = new StreamReader(stm)) { //var content = reader.ReadToEnd(); var content = await reader.ReadToEndAsync(); return content; } } }
UI線程下調用代碼如下:
var theRet = GetContent("http://sd.csdn.net/a/20120326/313535.html"); MessageBox.Show(theRet.Result);
await關鍵字是表示等待後面非同步呼叫可用,起到非同步轉同步的作用,調試時也確實在await語句時被掛起了,其實介面無法做任何事情,這就跟同步調用沒什麼區別了,至少效果上一樣的,因此如果遇到這種需求,其實沒必要採用這種非同步轉同步的方式處理,直接同步處理調用就OK.
坦率的講,上面的代碼我沒有調試到結果,我用同步的方法很快就得到了結果,而用上述方法,就在var response = await wr.GetResponseAsync();語句時假死了,等了很久也沒有響應,所以就直接結束調式了,那位兄弟測試後可以得到結果的,麻煩告訴一下我,好找找原因.是我人品問題還是我的VS2011庫有問題,或者其它.
另外,CSDN的頭條非同步編程其實是個噱頭,應該是C#5.0提供了非同步方法呼叫同步調用的支援.
PS:非同步編程還是需要的,但要看地方.什麼事情做得太偏激都不好.