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

隨筆 - 55  文章 - 15  trackbacks - 0
<2013年1月>
303112345
6789101112
13141516171819
20212223242526
272829303112
3456789

常用鏈接

留言簿

隨筆分類

隨筆檔案

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

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

參考文章:
     1. Windows 8 應用程序開發人員博客: 使用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 是一個非搶占式的多任務環境,盡快地將控制權交還給操作系統是非常重要的)
      早期的程序員使用Timer->tick或者使用PeekMessage()定期地將控制權交還給系統。
      再后來,出現了真正的多線程,和多進程。即使一個進程不會霸占整個操作系統,但是,它還是有時會讓自己不能響應外界的交互。舉例來說,當你的Word執行一段費事的操作時,你任然可以打開Excel,但你不能同Word交互了。
      你可以使用多線程來完成一個需要長時間執行的任務,但是,你不能隨意地執行多線程。
      每個Windows 程序都有一個UI線程來和用戶進行交互,因為這個UI線程非常之重要,Windows框架允許有一個輔助線程,而且Windows的框架有一個排列輔助線程代碼的機制,使得這些代碼可以運行在UI線程中。
      Windows Forms中,Control都有一個BeginInvoke()方法來執行輔助線程。WPF,Silverlight和WinPhone中,每個UI對象都有一個Dispatcher屬性,這是一個Dispatcher類對象,該對象都有一個BeginInvoke方法。
      Windows 8 中的方法就是使用異步編程了。

2. 異步編程和多線程的區別?

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

3. Windows 8 的UI策略?

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

4. 怎么理解異步?

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

5. 異步方法的使用

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

 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 }
    
            經過驗證,當我們的按鈕按下之后,會執行這個長時間的for循環,循環執行完畢之后,才會執行另一個線程。
            我們會看到,這里使用了Create_task來包裝這個IAsynOperation,Create_task方法給我的感覺就是起一個輔助線程,然后在這個線程中執行打開文件的操作。當我們執行完了PickAFileButton_Click之后,會立即執行Create_task中的方法,這時的控制權就交給了Windows 操作系統,操作系統替我們打開一個FilePicker,我們選定了一個文件之后,執行then操作??梢钥吹?,在這個線程中,我們可以直接操作UI,為什么呢?因為所有在UI線程中執行的異步操作都是在STA中的,單線程環境,所以不用Dispatcher回UI線程中。
            在C++中我們使用Create_task().then();的方法,在C#中我們使用await關鍵字,更方便些。
      注意:then([]()->T Result{});中的方法依然是一個異步方法。你可以有多個延續Create_task(IAsyncOperation^ operation).then([](){}).then([](){}).then([](){});
            另外,不是所有的異步操作都能執行成功的,我們可以在then中進行異常處理。

所有的東西都被我們可愛的Concurrency::task類包辦了,為什么說task類包辦了呢?請看下一章,Windows 8 的異步處理(二)可愛的task.then()。你會發現,它簡化了我們的很多操作,大家真的應該試一試。
     
      
posted on 2013-01-06 15:29 Dino-Tech 閱讀(1771) 評論(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>
            一区二区三区在线观看欧美| 欧美精品免费在线| 小嫩嫩精品导航| 免费看成人av| 中国女人久久久| 另类综合日韩欧美亚洲| 国产精品一区二区a| 亚洲女人天堂av| 亚洲一区一卡| 欧美一区午夜精品| 亚洲国产专区校园欧美| 亚洲黄色成人久久久| 欧美特黄一区| 亚洲东热激情| 国产一区二区精品久久99| 欧美国产三区| 国产一区二区三区自拍| 日韩视频第一页| 在线看国产日韩| 久久爱www| 欧美在线观看日本一区| 欧美日韩一区二区三区四区在线观看| 欧美在线日韩精品| 国产欧美日韩免费| 一区二区欧美精品| 亚洲专区免费| 欧美亚韩一区| 中文在线资源观看网站视频免费不卡 | 国产精品一区二区久久久| 欧美国产成人在线| 国产在线播放一区二区三区| 午夜一区二区三区不卡视频| 久久er精品视频| 国产一区二区三区四区老人| 欧美在线视频不卡| 久久一区精品| 久久国产婷婷国产香蕉| 久久中文在线| 亚洲精品亚洲人成人网| 欧美激情片在线观看| 一本色道久久综合狠狠躁篇的优点| 亚洲免费精彩视频| 国产精品裸体一区二区三区| 午夜精品久久久久久99热| 麻豆精品视频在线观看视频| 亚洲国产日韩一区| 欧美日韩免费在线| 久久成人免费网| 欧美黄污视频| 亚洲欧美另类在线观看| 国产欧美一二三区| 欧美一区二区视频97| 亚洲国产一区二区视频| 国产精品豆花视频| 巨胸喷奶水www久久久免费动漫| 亚洲大胆av| 久久亚洲精品欧美| 亚洲一区在线直播| 一区二区三区在线观看视频| 国产精品hd| 欧美成人视屏| 久久综合九色综合欧美狠狠| 亚洲欧美日韩在线综合| 一区二区三区视频观看| 亚洲第一页在线| 欧美高清视频免费观看| 欧美一区二区日韩| 夜夜嗨av一区二区三区四区| 亚洲国产一区在线观看| 亚洲国产成人av| 亚洲国产日本| 亚洲精品欧美日韩专区| 亚洲精美视频| 99亚洲精品| 亚洲天堂成人在线观看| 久久亚洲高清| 欧美成人一区在线| 玖玖视频精品| 欧美激情第三页| 欧美日韩免费观看中文| 国产精品黄视频| 国产日韩精品视频一区| 极品av少妇一区二区| 亚洲第一精品久久忘忧草社区| 亚洲电影激情视频网站| 亚洲一卡久久| 久久久久在线| 亚洲区第一页| 欧美在线视频免费| 欧美久久在线| 今天的高清视频免费播放成人 | 久久久久国色av免费看影院 | 久久久久久久91| 亚洲欧洲日本国产| 久久精品国产2020观看福利| 欧美岛国激情| 国内精品久久久久久久影视蜜臀| 亚洲精品日韩激情在线电影 | 欧美一区二区三区另类| 裸体女人亚洲精品一区| 午夜精品久久久久| 欧美日韩国产色视频| 亚洲成色最大综合在线| 久久精品电影| 欧美一区二粉嫩精品国产一线天| 欧美涩涩网站| 亚洲午夜激情免费视频| 99综合电影在线视频| 欧美国产91| 99综合精品| 日韩视频永久免费| 欧美日韩国产999| 亚洲午夜影视影院在线观看| 国产欧美一区二区三区另类精品| 91久久线看在观草草青青| 免费观看一区| 免费高清在线一区| 亚洲国语精品自产拍在线观看| 欧美va天堂va视频va在线| 麻豆精品在线观看| 亚洲精品乱码视频| 亚洲理论在线| 国产在线精品成人一区二区三区| 久久漫画官网| 欧美日韩成人一区| 午夜精彩视频在线观看不卡 | 欧美在线日韩精品| 国产欧美日本一区视频| 麻豆久久久9性大片| 欧美成人精品一区二区| 亚洲综合激情| 久久在线观看视频| 亚洲视频欧美在线| 久久综合色婷婷| 午夜精品国产更新| 欧美激情一区二区三区蜜桃视频| 亚洲无吗在线| 欧美成人午夜激情视频| 欧美亚洲午夜视频在线观看| 美日韩免费视频| 欧美一区免费| 欧美婷婷在线| 亚洲精品日本| 亚洲精品人人| 欧美.com| 亚洲国产导航| 亚洲福利精品| 久久精品亚洲精品| 久久婷婷麻豆| 国产美女一区二区| 午夜精品999| 久久亚洲春色中文字幕| 黄色成人小视频| 久久精品国产亚洲高清剧情介绍| 亚洲一区二区三区精品动漫| 欧美日韩精品免费观看视频| 欧美激情国产高清| 亚洲精美视频| 欧美天堂亚洲电影院在线观看| 亚洲成色www8888| 免费看亚洲片| 亚洲精品国产无天堂网2021| 日韩视频免费观看高清在线视频 | 欧美午夜宅男影院在线观看| 亚洲日本一区二区三区| 亚洲欧美不卡| 国产欧美综合在线| 欧美一区亚洲| 91久久精品一区二区三区| 一区二区毛片| 国产视频一区在线| 老司机一区二区三区| 99国产精品视频免费观看| 亚洲欧美精品在线观看| 在线精品视频在线观看高清| 国产精品黄色在线观看| 免费在线观看精品| 亚洲欧美日韩区| 亚洲片区在线| 欧美成人精品福利| 久久aⅴ国产紧身牛仔裤| 亚洲裸体视频| 亚洲国产精品一区在线观看不卡 | 亚洲老板91色精品久久| 老司机午夜精品视频在线观看| 亚洲一区二区三区色| 一区二区三区在线免费播放| 国产精品亚洲产品| 国产精品激情| 国产精品电影网站| 国产精品播放| 欧美日韩精品免费在线观看视频| 久久99伊人| 久久亚洲综合| 看片网站欧美日韩| 美女成人午夜| 欧美刺激性大交免费视频| 久久一区精品| 你懂的国产精品| 欧美大片在线看|