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

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

常用鏈接

留言簿

隨筆分類

隨筆檔案

搜索

  •  

最新評(píng)論

閱讀排行榜

評(píng)論排行榜

     這是Windows 8 異步編程的第二部分,為什么分成兩節(jié)呢,因?yàn)椋诙?jié)確實(shí)太讓人興奮了。恰巧有篇Windows 8 開發(fā)人員博客也是這樣一個(gè)結(jié)構(gòu),題目是WinRT 和 await,之前看過,沒有什么感覺,今天試了一下,里面還是有很多需要注意的地方。

參考文獻(xiàn):
      1. Windows 8 應(yīng)用程序開發(fā)人員博客:深入探究WinRT和await:http://blogs.msdn.com/b/windowsappdev_cn/archive/2012/04/30/winrt-await.aspx 
      2. MSDN

因?yàn)槲沂褂玫氖荂++語言,所以我主要是用C++來編程,C#開發(fā)的朋友可以看參考文獻(xiàn)1,以下是我的理解和我覺得重要的東西。請(qǐng)?jiān)徫矣幸徊糠謨?nèi)容是摘抄自文獻(xiàn)1.
一。 基礎(chǔ)知識(shí)
      我也覺得應(yīng)該從基礎(chǔ)著手,WinRT中的所有異步功能全部源自一個(gè)接口:Windows::Foundation::IAsyncInfo

1 public interface IAsyncInfo
2 {
3     AsyncStatus Status { get; }//只讀
4     HResult ErrorCode { get; }//只讀
5     uint Id { get; }//只讀
6 
7     void Cancel();
8     void Close();
9 }
      所有的異步操作都應(yīng)該實(shí)現(xiàn)此接口。但是該接口缺少了一個(gè)至關(guān)重要的功能:操作完成之后的回調(diào)函數(shù)。因此就有了下面四個(gè)接口。我想說,請(qǐng)大家注意每個(gè)新街口中都有一個(gè)Completed的屬性,我們可以設(shè)置這個(gè)屬性所要執(zhí)行的代碼,就是我們的操作完成之后,將要執(zhí)行的代碼。

1
 public interface IAsyncAction : IAsyncInfo
 2 {
 3     AsyncActionCompletedHandler Completed { getset; }
 4     void GetResults();// void,不返回結(jié)果
 5 }
 6 
 7 public interface IAsyncOperation<TResult> : IAsyncInfo
 8 {
 9     AsyncOperationCompletedHandler<TResult> Completed { getset; }
10     TResult GetResults();//TResult 返回結(jié)果
11 }
12 
13 public interface IAsyncActionWithProgress<TProgress> : IAsyncInfo
14 {
15     AsyncActionWithProgressCompletedHandler<TProgress> Completed { getset; }
16     AsyncActionProgressHandler<TProgress> Progress { getset; }//有Progress
17     void GetResults();//void,不返回結(jié)果
18 }
19 
20 public interface IAsyncOperationWithProgress<TResult, TProgress> : IAsyncInfo
21 {
22     AsyncOperationWithProgressCompletedHandler<TResult, TProgress> Completed { getset; }
23     AsyncOperationProgressHandler<TResult, TProgress> Progress { getset; }//有Progress
24     TResult GetResults();//TResult,返回結(jié)果
25 }
    
        暫停,我想說,C#開發(fā)人員真的很幸運(yùn),C++開發(fā)人員需要寫很久的代碼,C#只要一點(diǎn)點(diǎn)就足夠了。這是我的牢騷,請(qǐng)忽略。
      那么我們還是以打開文件為例吧,上一篇文章中,我們使用了create_task這個(gè)方法,打開了文件,并且將一些內(nèi)容顯示在一個(gè)OutputTextBlock中,現(xiàn)在我們不使用task類,只使用我們的IAsyncOperation來做。
      好,下面是C++同學(xué)的時(shí)間,請(qǐng)問,你能寫出completed這個(gè)event的代碼么?并保證其運(yùn)行。

那開始吧。要知道FileOpenPicker::PickSingleFileAsync()返回的是一個(gè)Windows::Foundation::IAsyncOperation<Windows::Storage::StorageFile^>^類型的操作:
Windows::Foundation::IAsyncOperation<Windows::Storage::StorageFile^>^ operation = openPicker->PickSingleFileAsync();//為了讓大家看清楚類型,就沒有用auto簡寫,大家用auto的話會(huì)非常簡單
      對(duì)應(yīng)上面的四個(gè)接口,顯然,返回的是第二個(gè)接口IAsyncOperation<T TResult>^操作,那么它有一個(gè)Windows::Foundation::AsyncOperationCompletedHandler<TResult>^ 類型的Completed事件,那么我們的completed就應(yīng)該寫成這樣:
operation->Completed = ref new Windows::Foundation::AsyncOperationCompletedHandler<Windows::Storage::StorageFile^>(//暫時(shí)省略);
      好復(fù)雜!
      還沒完,繼續(xù)。AsyncOperationCompletedHandler是一個(gè)Delegate,這個(gè)Delegate其實(shí)就是原來的函數(shù)指針封裝了一下,既然是函數(shù)指針,那么肯定有參數(shù),怎么尋找這個(gè)參數(shù)呢?把鼠標(biāo)移到這個(gè)方法上,按下F12就會(huì)談到Object Browse里面去,你就會(huì)發(fā)現(xiàn)這個(gè)Delegate,它有一個(gè)Invoke(。。。)方法,里面就是它的參數(shù)了。
      另外,我們沒使用+=操作符,而是使用了=,為什么呢?因?yàn)镃ompleted是個(gè)屬性,不是個(gè)event。。。
      回調(diào)函數(shù)的代碼段,我們用Lambda表達(dá)式來寫:
       1 operation->Completed = ref new Windows::Foundation::AsyncOperationCompletedHandler<Windows::Storage::StorageFile^>([this](Windows::Foundation::IAsyncOperation<Windows::Storage::StorageFile^>^ asyncInfo, Windows::Foundation::AsyncStatus status) 
 2         {
 3             //這里,貌似程序會(huì)在這里執(zhí)行3次,具體原理不太清楚。
 4             if(status == Windows::Foundation::AsyncStatus::Completed)
 5             {
 6                 //因?yàn)閳?zhí)行3次,所以我在這個(gè)里面加了一個(gè)計(jì)數(shù)器,但是最終的結(jié)果還是1,這個(gè)異步方法還是執(zhí)行了一次
 7                 //這里為什么是要Dispatcher->RunAsync呢,因?yàn)椋@是一個(gè)回調(diào)函數(shù),另一個(gè)線程中了。
 8                 //可以看到,這所有的一切都可以用then或者await來代替。
 9                 this->Dispatcher->RunAsync(Windows::UI::Core::CoreDispatcherPriority::Normal, ref new Windows::UI::Core::DispatchedHandler([this](){
10                     static int i = 0;
11                     i++;
12                     OutputTextBlock->Text = i.ToString();
13                 }));
14             }
15             //如果執(zhí)行了operation->Canceled()方法會(huì)到這里
16             else if(status == Windows::Foundation::AsyncStatus::Canceled)
17             {
18                 this->Dispatcher->RunAsync(Windows::UI::Core::CoreDispatcherPriority::Normal, ref new Windows::UI::Core::DispatchedHandler([this](){
19                     OutputTextBlock->Text = "Canceled";
20                 }));
21             }
22             //操作出現(xiàn)錯(cuò)誤會(huì)到這里
23             else if(status == Windows::Foundation::AsyncStatus::Error)
24             {
25                 this->Dispatcher->RunAsync(Windows::UI::Core::CoreDispatcherPriority::Normal, ref new Windows::UI::Core::DispatchedHandler([this](){
26                     OutputTextBlock->Text = "Error";
27                 }));
28             }
29             //這里不能返回StorageFile^ 類型的對(duì)象,為神馬呢?因?yàn)門Result是void,如果你返回了,那么編譯器會(huì)提醒你很長一段東西,你自己就會(huì)發(fā)現(xiàn)了
30             //return safe_cast<Windows::Storage::StorageFile^>(asyncInfo->GetResults());
31         });

      具體的內(nèi)容都是上面的這段代碼了,有些東西我想再提醒一下。
1. 首先,我們來看第30行,因?yàn)槲矣X得這個(gè)方法是返回一個(gè)StorageFile對(duì)象的,所以我在Lambda方法中理應(yīng)返回它,但是如果返回的話,就是錯(cuò)誤的,為什么?原因是這里的返回值實(shí)際上是Invoke方法的返回值,在這里這個(gè)返回值是void的,所以你不能返回任何東西。
2. 使用asyncInfo->GetResults();可以得到你的結(jié)果,回頭看看那四個(gè)接口,有些返回TResult,有些返回void,是吧。
3. 在這個(gè)代碼段里,我們已經(jīng)跑到了另外一個(gè)線程中去了,如果你想操作UI,那么,你必須使用Dispatcher->RunAsync方法調(diào)度回UI線程,不信你可以試試。
4. 你可以在代碼中判斷現(xiàn)在IAsyncOperation的狀態(tài)。


       哦,看看C#程序員的優(yōu)越性把:
op.Completed = (info, status) =>
            {
                if (status == AsyncStatus.Completed)
                {
                    SyndicationFeed feed = info.GetResults();
                    UpdateAppWithFeed(feed);
                }
                else if (status == AsyncStatus.Canceled)
                {
                    // Operation canceled
                }
                else if (status == AsyncStatus.Error)
                {
                    // Error occurred, Report error
                }
            };
       
希望你還能堅(jiān)持。*^◎^*
       看到這里你發(fā)現(xiàn)了么?這段代碼的功能其實(shí)是跟上一篇代碼的功能一模一樣,再把之前的代碼貼過來
 1 create_task(openPicker->PickSingleFileAsync()).then([this](StorageFile^ file)
 2         {
 3             if (file)
 4             {
 5                 OutputTextBlock->Text = "Picked photo: " + file->Name;
 6             }
 7             else
 8             {
 9                 OutputTextBlock->Text = "Operation cancelled.";
10             }
11         }).then([this](task<void> t)
12         {
13             try{
14                 t.get();
15             }catch(Platform::Exception^ e)
16             {
17                 OutputTextBlock->Text = e->Message
18             }
19         });
    
      額,希望你能明白,task為我們做了些什么東西。我來總結(jié)一下吧:
1. 沒有了復(fù)雜的completed回調(diào)函數(shù),操作完成之后,執(zhí)行then中的代碼,簡單而明了。
2. then中的異步代碼是在UI線程中的,沒有Dispatcher->RunAsync方法,不是么?
3. 可以有多個(gè)then
4. 可以處理異常,不是更強(qiáng)大么?
      task為我們做的,就是從30多行復(fù)雜的代碼精簡到只有20行。

至于原理,大家可以閱讀參考文獻(xiàn)1,我暫時(shí)還沒有怎么理解。。。
posted on 2013-01-06 16:43 Dino-Tech 閱讀(1996) 評(píng)論(0)  編輯 收藏 引用

只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            国产精品亚洲片夜色在线| 亚洲人成啪啪网站| 在线综合+亚洲+欧美中文字幕| 狼人天天伊人久久| 欧美成人一区二区三区| 欧美有码视频| 亚洲欧美日韩综合| 亚洲日本一区二区| 欧美成人激情在线| 久久国内精品自在自线400部| 日韩视频在线免费观看| 黄色在线一区| 国产精品尤物| 欧美人体xx| 亚洲精品欧美激情| 亚洲自拍偷拍视频| 欧美一区二视频在线免费观看| 亚洲精品久久久蜜桃| 欧美激情国产日韩| 亚洲欧洲一区二区在线观看| 蜜桃av一区| 国产真实乱偷精品视频免| 免费一级欧美片在线播放| 亚洲老司机av| 久久精品视频网| 亚洲精品一区二区三区不| 亚洲精品久久久蜜桃| 亚洲综合精品一区二区| 99视频精品全部免费在线| 狠狠爱www人成狠狠爱综合网| 午夜精品久久久久久久99热浪潮| 9色国产精品| 亚洲男人的天堂在线| 亚洲永久免费观看| 国产精品黄色在线观看| 亚洲三级电影全部在线观看高清| 校园春色综合网| 亚洲精品久久久蜜桃| 亚洲欧美日韩综合国产aⅴ| 免费毛片一区二区三区久久久| 欧美成人一区二区三区片免费| 久久综合一区二区| 国产精品视频1区| 精品盗摄一区二区三区| 久久夜色精品国产| 欧美国产日本高清在线| 日韩亚洲欧美在线观看| 亚洲大胆人体在线| 欧美xx69| 影音先锋亚洲视频| 欧美黄色大片网站| 久久午夜av| 在线日韩av永久免费观看| 亚洲黄色影片| 欧美大片网址| 久久精品免费播放| 欧美国产欧美亚洲国产日韩mv天天看完整| 亚洲经典三级| 国产精品99久久久久久久vr| 国产精品久久久久久模特| 午夜欧美大尺度福利影院在线看 | 91久久视频| 亚洲一区二区三区精品视频| 国产欧美精品在线| 亚洲黄色高清| 欧美精品18| 美女亚洲精品| 亚洲一区二区视频| 久久久久久日产精品| 亚洲激情在线观看| 久久国产婷婷国产香蕉| 亚洲高清视频的网址| 一本色道久久综合亚洲精品小说 | 久久久国产精品一区二区三区| 欧美在线在线| 一区二区三区不卡视频在线观看 | 亚洲永久字幕| 欧美日韩精品综合在线| 久久久久国产精品一区三寸| 欧美大片一区| 久久天天狠狠| 国产精品久久久久久久久久免费| 久久成人18免费网站| 浪潮色综合久久天堂| 亚洲高清免费在线| 久久久久久久国产| 久久精品91| 国产日产亚洲精品| 欧美一区综合| 久久这里只有精品视频首页| 欧美日韩中文在线| 免费日韩成人| 国产精品国产三级欧美二区| 夜夜嗨av一区二区三区中文字幕 | 亚洲国产精品久久久| 午夜精品在线观看| 久久大逼视频| 日韩视频亚洲视频| 国产日韩欧美视频在线| 欧美一区二区私人影院日本| 久久成人18免费观看| 国产精品日韩欧美综合| 亚洲伦理精品| 午夜精品免费| 亚洲欧美激情精品一区二区| 国产日本欧美在线观看| 欧美中文在线字幕| 亚洲精品乱码久久久久久按摩观| 国产一区二区精品久久91| 亚洲专区一二三| 免费成人av资源网| 欧美一区二区三区精品 | 午夜精品久久99蜜桃的功能介绍| 亚洲欧洲精品一区二区| 欧美人体xx| 久久精品亚洲乱码伦伦中文| 欧美激情一区二区三区全黄| 在线播放豆国产99亚洲| 欧美一区免费视频| 老司机久久99久久精品播放免费| 久久精品国内一区二区三区| 亚洲一本大道在线| 亚洲国产精品久久91精品| 一区二区三区.www| 亚洲日本成人| 久久精品成人| 久久高清免费观看| 禁断一区二区三区在线| 国产日韩欧美自拍| 亚洲第一搞黄网站| 一区二区久久久久| 久久丁香综合五月国产三级网站| 久久精品99久久香蕉国产色戒| 久久精品国产综合| 亚洲第一在线综合在线| 亚洲美女在线视频| 亚洲欧美一区二区激情| 美国三级日本三级久久99| 欧美日韩网站| 亚洲欧洲一区二区三区| 中国日韩欧美久久久久久久久| 亚洲欧美另类国产| 欧美xart系列高清| 午夜免费电影一区在线观看| 欧美精品首页| 亚洲高清电影| 噜噜噜躁狠狠躁狠狠精品视频 | 原创国产精品91| 午夜精品短视频| 在线一区观看| 国产精品白丝av嫩草影院| 亚洲精品色婷婷福利天堂| 久久精品国产69国产精品亚洲| 日韩一区二区高清| 欧美日韩国产专区| 一本一本久久| 亚洲区在线播放| 欧美日韩国产高清视频| 欧美激情精品久久久久| 国产亚洲午夜| 欧美在线观看视频一区二区| 亚洲视频一起| 在线成人国产| 在线综合亚洲| 欧美成人自拍视频| 好看不卡的中文字幕| 午夜精品av| 欧美影院精品一区| 国产精品入口| 欧美一级一区| 亚洲午夜精品17c| 女仆av观看一区| 亚洲国产精品第一区二区| 一区二区三区在线观看欧美| 欧美在线观看一区二区三区| 久久久精品动漫| 亚洲国产高清一区| 欧美黄色aaaa| 亚洲男女毛片无遮挡| 久久婷婷影院| 亚洲日本电影在线| 欧美日韩精品在线播放| 亚洲一区二区三区色| 欧美在线观看视频| 亚洲国产精彩中文乱码av在线播放| 久久全球大尺度高清视频| 亚洲欧洲精品一区| 午夜亚洲伦理| 国产一区二区三区免费不卡| 亚洲女同同性videoxma| av成人免费在线| 国产在线观看91精品一区| 在线视频欧美精品| 在线一区免费观看| 欧美日韩国产美| 国产精品99久久久久久白浆小说| 亚洲一区二区三区四区五区黄| 欧美丝袜一区二区三区| 亚洲精品在线视频观看| 一区二区三区精品国产|