青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆 - 55  文章 - 15  trackbacks - 0
<2012年10月>
30123456
78910111213
14151617181920
21222324252627
28293031123
45678910

常用鏈接

留言簿

隨筆分類

隨筆檔案

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

     學而不思則罔,思而不學則殆,溫故而知新。
     周末,老婆去上班去了(因為是2013年元旦,你知道的,休3天,上8天班,今天是上班時間),我們公司休1天,正常周末。閑來無事,想想之前寫了好多東西,有時候碰到了又要重新看一遍,效率太低,還是抽個時間整理一下。于是就有了溫故知新這一系列的文章。

參考文章:
     1. Windows 8 應用程序開發(fā)人員博客: 使用Windows 運行時異步性來始終保持應用程序能快速流暢地運行:http://blogs.msdn.com/b/windowsappdev_cn/archive/2012/03/26/windows.aspx
     2. Petzold的博客: Asynchronous Processing in Windows 8  http://www.charlespetzold.com/blog/2011/11/Asynchronous-Processing-in-Windows-8.html
     3. MSDN

     WinRT的異步編程,Windows 程序設計這本書的作者說,如果寫Windows 8 的書,第一章一定是異步編程(雖然它最后的書第一章不是這個),可見異步編程對于Windows 8 的重要性。本文簡單介紹我對異步編程的理解吧,不對的地方請大家指正!歡迎交流。

1.多線程的重要性
     From the very early days of Windows programming, application developers realize that they couldn't arbitrary execute a big chunk of lengthly code.
     "Windows is a nonpreemptive multitasking environment, and it is important that programs return control to Windows as quickly as possible."(Windows 是一個非搶占式的多任務環(huán)境,盡快地將控制權交還給操作系統(tǒng)是非常重要的)
      早期的程序員使用Timer->tick或者使用PeekMessage()定期地將控制權交還給系統(tǒng)。
      再后來,出現(xiàn)了真正的多線程,和多進程。即使一個進程不會霸占整個操作系統(tǒng),但是,它還是有時會讓自己不能響應外界的交互。舉例來說,當你的Word執(zhí)行一段費事的操作時,你任然可以打開Excel,但你不能同Word交互了。
      你可以使用多線程來完成一個需要長時間執(zhí)行的任務,但是,你不能隨意地執(zhí)行多線程。
      每個Windows 程序都有一個UI線程來和用戶進行交互,因為這個UI線程非常之重要,Windows框架允許有一個輔助線程,而且Windows的框架有一個排列輔助線程代碼的機制,使得這些代碼可以運行在UI線程中。
      Windows Forms中,Control都有一個BeginInvoke()方法來執(zhí)行輔助線程。WPF,Silverlight和WinPhone中,每個UI對象都有一個Dispatcher屬性,這是一個Dispatcher類對象,該對象都有一個BeginInvoke方法。
      Windows 8 中的方法就是使用異步編程了。

2. 異步編程和多線程的區(qū)別?

      這是我自己的疑惑,我的感覺是,異步編程是在UI線程中存在的概念,是為了實現(xiàn)上面所說的輔助線程用的。只不過在Windows8 中我們不使用顯式的BeginInvoke()方法,而是使用了Async方法。不過有時候當一個線程想要操作UI的時候還是需要Dispatcher->RunAsync()方法。
      異步編程也是多線程的一種。

3. Windows 8 的UI策略?

      Windows 8 的UI講究快速流暢,程序不能讓用戶感覺到假死的現(xiàn)象,如果一個UI操作(比如點擊按鈕代開一個文件)用時超過了50毫秒,那么用戶會感覺到卡頓,影響用戶體驗。微軟把這些可能超過50毫秒的方法全部弄成異步的,讓他們運行在輔助線程中,保證UI的流暢性。

4. 怎么理解異步?

       異步就是回調(diào),講回調(diào)的時候都會舉這么一個例子:通過電話為某人提供回撥號碼。首先,為他提供回撥號碼,然后掛斷,做自己愛做的事情,當他把事情處理完畢,通過電話號碼撥通你的電話。這就是回調(diào),這也是異步。

5. 異步方法的使用

       考慮一下你點擊一個按鈕,選擇打開一個文件。不同于之前的Windows 版本,現(xiàn)在Windows 8 中沒有了打開文件夾的對話框,取而代之的是文件選擇器(FilePicker),這個玩意在Windows::Storage::Pickers命名空間中。
      你要做的就是初始化一個選擇器,指定打開文件的后綴名和初始地址,然后調(diào)用PickSingleFileAsync()方法。
      你已經(jīng)看到了這個方法以Async結尾,這意味著它是個異步方法,有可能會超過50毫秒。異步方法一般會返回一個IAsyncOperation<T Result>^對象,T是這個方法返回的結果。
      如果你的On_Button_Clicked(...)方法中還有其他的代碼的話,那么回先執(zhí)行其他代碼,然后,將控制權交給Windows 系統(tǒng),Windows 系統(tǒng)會使用FilePicker打開一個文件,當打開之后,我們執(zhí)行then(...)操作,也稱為異步方法的延續(xù)。
      做個實驗吧,驗證一下異步操作的執(zhí)行順序。

 1 void Scenario1::PickAFileButton_Click(Object^ sender, RoutedEventArgs^ e)
 2 {
 3     // Clear previous returned file name, if it exists, between iterations of this scenario
 4     rootPage->ResetScenarioOutput(OutputTextBlock);
 5 
 6     if (rootPage->EnsureUnsnapped())
 7     {
 8         FileOpenPicker^ openPicker = ref new FileOpenPicker();
 9         openPicker->ViewMode = PickerViewMode::Thumbnail;
10         openPicker->SuggestedStartLocation = PickerLocationId::PicturesLibrary;
11         openPicker->FileTypeFilter->Append(".jpg");
12         openPicker->FileTypeFilter->Append(".jpeg");
13         openPicker->FileTypeFilter->Append(".png");
14 
15         create_task(openPicker->PickSingleFileAsync()).then([this](StorageFile^ file)
16         {
17             if (file)
18             {
19                 OutputTextBlock->Text = "Picked photo: " + file->Name;
20             }
21             else
22             {
23                 OutputTextBlock->Text = "Operation cancelled.";
24             }
25         }).then([this](task<void> t)
26         {
27             try{
28                 t.get();
29             }catch(Platform::Exception^ e)
30             {
31                 OutputTextBlock->Text = e->Message;
32             }
33         });
34         for(int i = 0 ; i < 1000000000; i++)
35         {
36             int j = 0; 
37             j++;
38         }
39         int k = 0; 
40         k++;
41     }
42 }
    
            經(jīng)過驗證,當我們的按鈕按下之后,會執(zhí)行這個長時間的for循環(huán),循環(huán)執(zhí)行完畢之后,才會執(zhí)行另一個線程。
            我們會看到,這里使用了Create_task來包裝這個IAsynOperation,Create_task方法給我的感覺就是起一個輔助線程,然后在這個線程中執(zhí)行打開文件的操作。當我們執(zhí)行完了PickAFileButton_Click之后,會立即執(zhí)行Create_task中的方法,這時的控制權就交給了Windows 操作系統(tǒng),操作系統(tǒng)替我們打開一個FilePicker,我們選定了一個文件之后,執(zhí)行then操作。可以看到,在這個線程中,我們可以直接操作UI,為什么呢?因為所有在UI線程中執(zhí)行的異步操作都是在STA中的,單線程環(huán)境,所以不用Dispatcher回UI線程中。
            在C++中我們使用Create_task().then();的方法,在C#中我們使用await關鍵字,更方便些。
      注意:then([]()->T Result{});中的方法依然是一個異步方法。你可以有多個延續(xù)Create_task(IAsyncOperation^ operation).then([](){}).then([](){}).then([](){});
            另外,不是所有的異步操作都能執(zhí)行成功的,我們可以在then中進行異常處理。

所有的東西都被我們可愛的Concurrency::task類包辦了,為什么說task類包辦了呢?請看下一章,Windows 8 的異步處理(二)可愛的task.then()。你會發(fā)現(xiàn),它簡化了我們的很多操作,大家真的應該試一試。
     
      
posted on 2013-01-06 15:29 Dino-Tech 閱讀(1773) 評論(0)  編輯 收藏 引用 所屬分類: Windows 8
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲高清免费在线| 久久精品国产v日韩v亚洲| 欧美一级在线视频| 亚洲国产欧美一区二区三区久久| 亚洲日本久久| 黄色一区二区在线| 久热这里只精品99re8久| 国产区在线观看成人精品| 91久久精品国产91性色tv| 蜜臀a∨国产成人精品 | 久久精品人人爽| 国产农村妇女毛片精品久久莱园子| 一区二区三欧美| 亚洲三级观看| 欧美精品v日韩精品v国产精品 | 久久成人精品视频| 亚洲欧美日韩一区在线| 国产欧美日本一区视频| 久久成人免费电影| 久久精品72免费观看| 在线高清一区| 亚洲国产视频a| 欧美色另类天堂2015| 国产精品白丝jk黑袜喷水| 伊人夜夜躁av伊人久久| 亚洲国产精品久久久久秋霞蜜臀| 亚洲靠逼com| 久久精品久久99精品久久| 亚洲国产免费看| 性欧美激情精品| 美女主播精品视频一二三四| 国产精品国产三级国产aⅴ入口| 一区二区三区自拍| 亚洲欧美中文在线视频| 亚洲国产精品成人va在线观看| 亚洲网站视频福利| 欧美激情1区2区| 狠狠色狠狠色综合系列| 亚洲免费网站| 久久精品国产精品| 欧美一级二级三级蜜桃| 亚洲国产成人porn| 久久精品人人做人人综合| 国产精品毛片a∨一区二区三区| 最新精品在线| 欧美91福利在线观看| 西瓜成人精品人成网站| 欧美午夜片在线免费观看| 亚洲国产高清自拍| 国产精品专区第二| 亚洲性感美女99在线| 欧美电影免费观看| 久久欧美中文字幕| 国产综合色一区二区三区| 欧美一区二区三区免费观看视频 | 国产日韩欧美精品| 亚洲淫性视频| 日韩一二三区视频| 欧美片在线播放| 欧美一级夜夜爽| 国产精品99免费看 | 亚洲国产日韩一区| 老妇喷水一区二区三区| 国产精品第三页| 最新69国产成人精品视频免费| 一区二区三区精品久久久| 亚洲日本无吗高清不卡| 欧美日韩精品在线播放| 制服丝袜激情欧洲亚洲| 一区二区日韩欧美| 国产精品日韩欧美| 久久久99精品免费观看不卡| 久久精品国产精品| 亚洲人体大胆视频| 日韩午夜中文字幕| 欧美天堂亚洲电影院在线播放| 夜色激情一区二区| 久久九九久精品国产免费直播| 欧美一区二区三区免费大片| 一区视频在线| 亚洲美洲欧洲综合国产一区| 国产精品久久久久久久7电影 | 日韩一二三区视频| 国产人成精品一区二区三| 久久亚洲精品网站| 欧美国产第二页| 亚洲欧洲av一区二区| 欧美一区二区黄色| 亚洲精品国产精品国自产在线 | 亚洲午夜精品久久久久久app| 国产精品一区亚洲| 欧美二区不卡| 国产精品久久久久aaaa| 久久伊人精品天天| 欧美乱妇高清无乱码| 欧美中文字幕不卡| 欧美激情一区二区三区全黄| 午夜精品短视频| 噜噜噜躁狠狠躁狠狠精品视频| 亚洲天堂av在线免费观看| 久久精品盗摄| 亚洲天堂免费观看| 久久久国产91| 亚洲欧美综合v| 欧美1级日本1级| 性欧美xxxx视频在线观看| 久久天天躁狠狠躁夜夜av| 亚洲欧美日产图| 欧美国产欧美亚洲国产日韩mv天天看完整 | 欧美一区亚洲二区| 女人香蕉久久**毛片精品| 午夜一区在线| 亚洲毛片在线观看.| 久久久久99精品国产片| 欧美在线91| 亚洲欧美一级二级三级| 亚洲一区视频在线观看视频| 国产精品久久久久久超碰| 欧美va亚洲va日韩∨a综合色| 久久精品国产清自在天天线| 午夜天堂精品久久久久| 欧美日本不卡| 亚洲福利视频一区二区| 禁断一区二区三区在线| 亚洲欧美日韩中文视频| 亚洲一区观看| 欧美日韩国产在线看| 欧美国产日本在线| 亚洲福利国产精品| 老司机成人在线视频| 免费观看不卡av| 在线不卡中文字幕播放| 久久精品亚洲精品| 久久香蕉国产线看观看网| 国产亚洲视频在线观看| 亚洲私人影院在线观看| 亚洲一区二区三区午夜| 国产精品vip| 亚洲视频第一页| 亚洲欧美美女| 国产精品一区一区三区| 亚洲图片在线| 久久精品二区亚洲w码| 国产人成一区二区三区影院| 亚洲一区国产精品| 欧美一区二区在线视频| 国产日韩欧美三级| 久久国产精品99久久久久久老狼| 久久视频一区二区| 亚洲欧洲精品一区二区三区波多野1战4 | 亚洲福利在线视频| 日韩一区二区福利| 亚洲三级免费| 亚洲国产欧美精品| 一本色道综合亚洲| 国产精品理论片| 亚洲欧美一区二区精品久久久| 欧美综合77777色婷婷| 国模套图日韩精品一区二区| 久热精品在线视频| 日韩视频三区| 久久精品国产一区二区三区免费看 | 99在线热播精品免费| 午夜欧美电影在线观看| 国产综合久久久久影院| 欧美大香线蕉线伊人久久国产精品| 亚洲国产一区二区a毛片| 亚洲一区二区三区在线播放| 国产一区久久| 欧美激情综合在线| 欧美一区二区精品久久911| 国产欧美大片| 欧美成人免费小视频| 正在播放欧美一区| 在线看片日韩| 国产精品免费网站| 国产精品捆绑调教| 国产欧美日韩亚洲一区二区三区| 欧美成年人视频网站欧美| 日韩午夜在线| 国模叶桐国产精品一区| 欧美日本免费| 久久视频在线视频| 亚洲一品av免费观看| 欧美国产欧美综合| 久久夜色精品亚洲噜噜国产mv| 一区二区三区欧美成人| 伊人蜜桃色噜噜激情综合| 国产精品久久久久久久久久尿| 久久综合色婷婷| 亚洲影视综合| 夜夜嗨av一区二区三区四区| 蜜桃av一区二区| 欧美一二三视频| 一本色道久久综合亚洲二区三区| 激情自拍一区| 国产真实乱偷精品视频免| 国产精品萝li| 欧美色图天堂网| 久久国产成人|