• <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>
            隨筆 - 55  文章 - 15  trackbacks - 0
            <2013年1月>
            303112345
            6789101112
            13141516171819
            20212223242526
            272829303112
            3456789

            常用鏈接

            留言簿

            隨筆分類

            隨筆檔案

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

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

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

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

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

            3. Windows 8 的UI策略?

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

            4. 怎么理解異步?

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

            5. 異步方法的使用

                   考慮一下你點(diǎn)擊一個按鈕,選擇打開一個文件。不同于之前的Windows 版本,現(xiàn)在Windows 8 中沒有了打開文件夾的對話框,取而代之的是文件選擇器(FilePicker),這個玩意在Windows::Storage::Pickers命名空間中。
                  你要做的就是初始化一個選擇器,指定打開文件的后綴名和初始地址,然后調(diào)用PickSingleFileAsync()方法。
                  你已經(jīng)看到了這個方法以Async結(jié)尾,這意味著它是個異步方法,有可能會超過50毫秒。異步方法一般會返回一個IAsyncOperation<T Result>^對象,T是這個方法返回的結(jié)果。
                  如果你的On_Button_Clicked(...)方法中還有其他的代碼的話,那么回先執(zhí)行其他代碼,然后,將控制權(quán)交給Windows 系統(tǒng),Windows 系統(tǒng)會使用FilePicker打開一個文件,當(dāng)打開之后,我們執(zhí)行then(...)操作,也稱為異步方法的延續(xù)。
                  做個實(shí)驗(yàn)吧,驗(yàn)證一下異步操作的執(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)過驗(yàn)證,當(dāng)我們的按鈕按下之后,會執(zhí)行這個長時間的for循環(huán),循環(huán)執(zhí)行完畢之后,才會執(zhí)行另一個線程。
                        我們會看到,這里使用了Create_task來包裝這個IAsynOperation,Create_task方法給我的感覺就是起一個輔助線程,然后在這個線程中執(zhí)行打開文件的操作。當(dāng)我們執(zhí)行完了PickAFileButton_Click之后,會立即執(zhí)行Create_task中的方法,這時的控制權(quán)就交給了Windows 操作系統(tǒng),操作系統(tǒng)替我們打開一個FilePicker,我們選定了一個文件之后,執(zhí)行then操作。可以看到,在這個線程中,我們可以直接操作UI,為什么呢?因?yàn)樗性赨I線程中執(zhí)行的異步操作都是在STA中的,單線程環(huán)境,所以不用Dispatcher回UI線程中。
                        在C++中我們使用Create_task().then();的方法,在C#中我們使用await關(guān)鍵字,更方便些。
                  注意:then([]()->T Result{});中的方法依然是一個異步方法。你可以有多個延續(xù)Create_task(IAsyncOperation^ operation).then([](){}).then([](){}).then([](){});
                        另外,不是所有的異步操作都能執(zhí)行成功的,我們可以在then中進(jìn)行異常處理。

            所有的東西都被我們可愛的Concurrency::task類包辦了,為什么說task類包辦了呢?請看下一章,Windows 8 的異步處理(二)可愛的task.then()。你會發(fā)現(xiàn),它簡化了我們的很多操作,大家真的應(yīng)該試一試。
                 
                  
            posted on 2013-01-06 15:29 Dino-Tech 閱讀(1752) 評論(0)  編輯 收藏 引用 所屬分類: Windows 8
            久久超碰97人人做人人爱| 久久这里只有精品首页| 日韩美女18网站久久精品| 久久亚洲高清综合| 亚洲综合日韩久久成人AV| 久久亚洲中文字幕精品有坂深雪 | 国内精品久久久久| 久久久久人妻一区精品果冻| 2021国产精品久久精品| 国产一级持黄大片99久久| 手机看片久久高清国产日韩| 天天爽天天狠久久久综合麻豆| 99久久精品无码一区二区毛片 | 成人久久免费网站| 狠狠色丁香婷婷综合久久来| 一个色综合久久| 国产午夜福利精品久久| 久久久久人妻精品一区二区三区 | 久久伊人五月丁香狠狠色| 色噜噜狠狠先锋影音久久| 免费精品久久天干天干| 久久精品亚洲乱码伦伦中文 | 日本精品久久久中文字幕| 伊人久久大香线蕉综合Av | 久久综合视频网| 色诱久久av| 欧美粉嫩小泬久久久久久久| 91精品国产综合久久香蕉| 91精品国产高清91久久久久久| 热re99久久精品国99热| 久久天天躁狠狠躁夜夜avapp| 久久亚洲天堂| 色综合久久中文字幕综合网| 久久影院久久香蕉国产线看观看| 国产精品va久久久久久久| 91久久精品国产免费直播| 好久久免费视频高清| 93精91精品国产综合久久香蕉| 久久电影网一区| 久久精品国产亚洲7777| 久久婷婷五月综合成人D啪|