设为首页 收藏本站
查看: 927|回复: 0

Windows 8 学习笔记(十七)--.WinRT 异步编程

[复制链接]

尚未签到

发表于 2015-5-22 12:31:43 | 显示全部楼层 |阅读模式
  我们知道,在WinRT中很多接口都是异步的,如StorageFile、MediaCapture等。它们都是以“Async”结尾。那使用异步编程有什么好处呢?估计大家都知道,当我们执行一个函数需要花费数秒钟,若使用同步方法,则会阻止UI线程,应用将不会响应用户操作,体验性将会非常糟糕。而使用异步编程,应用在等待完成时可以继续运行并响应UI。
  在WinRT中,每种语言都有其异步编程的模式:
  JavaScript :   承诺对象,then函数
  C#:  将来对象,await运算符
  VB:  将来对象,await运算符
  Visual C++:  task类,.then方法
  WinRT 异步编程(C#
  WinRT中的C#异步编程相对较简单,需要遵守几个规则:
  (1)      调用异步API的方法体前需要以async标识
  (2)      调用异步API需要使用await运算符
  Await运算符你可将其看作它告诉编译器当前正在调用某个异步方法,编译器可以执行其它的工作,无需在此等待。作用await运算符的好处是代码看上去不复杂,又易于理解和维护。


private async void CreateFile()
        {
            StorageFolder storageFolder = KnownFolders.DocumentsLibrary;
            StorageFile storageFile = await storageFolder.CreateFileAsync("template.txt",CreationCollisionOption.ReplaceExisting);
            OutputTextBlock.Text = storageFolder.Name + "has been created";   }
  
  WinRT 异步编程(C++
  C++异步编程相对C#较复杂些,主要通过ppltask.h中定义的任务类来使用异步方法。
  C++中直接使用异步WinRT API时,首选task类及其相关类型和函数,它们都包含在concurrency命名空间中,并且在ppltask.h中定义。
  (1)      利用create_task创建一个任务
  auto createFileTadk =create_task(folder->CreateFileAsync("aa.txt",CreationCollisionOption::ReplaceExisting));
  (2)      利用task::then实现异步完成时所执行的操作
  

  createFileTadk.then([this](StorageFile^ storageFileSample) {  
         String^ filename=storageFileSample->Name;                              
        });         

  
  task::then函数创建并返回的任务称为延续,异步工作成功完成后才会运行。若异步操作引发异常,或取消任务,则延续永远不会执行。以上是一个很简单的异步示例,在延续任务中没有异步任务,若在延续中我们还会再次执行异步任务,可能异步任务的延续中还会再有异步任务,这一系列的任务就会形成一个任务链,一环接一环,每个延续只有在前一个延续任务完成后才会执行,这就会形成这样一种形式:mytask.then().then().then();
  如上例操作,我需要在创建文件后,还得往文件写入内容,写完文件我还得给用户一个提示:
  

    createFileTadk.then([this](StorageFile^ storageFileSample) ->IAsyncAction^ {      
    String^ userContent="abcdwfwe";
    create_task(FileIO::WriteTextAsync(storageFileSample, userContent)).then([this, storageFileSample, userContent]()
                {
        MessageDialog^ message=ref new MessageDialog("File is completed create!");
        message->ShowAsync();
                });   
    });  
  捕获异步任务的异常
  我们可以通过task::get获取任务结果,其可以获取已经传输到该任务的所有。
  

createFileTadk.then([this](StorageFile^ storageFileSample) ->IAsyncAction^ {     
        String^ userContent="abcdwfwe";   
        return FileIO::WriteTextAsync(storageFileSample, userContent);
    }).then([](task t){
        try
        {
            t.get();            
            OutputDebugString(L"the content has been write into file!");
            //tbText->Text="the content has been write into file";
        }
        catch(Platform::COMException^ e)
        {
            
        }
    });  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-69570-1-1.html 上篇帖子: Windows 8 开发31日 下篇帖子: 谈一谈 Windows 8 的软件开发架构
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表