美文网首页
基于任务编程

基于任务编程

作者: 龙翱天际 | 来源:发表于2017-02-09 22:49 被阅读50次

基于任务编程

在卡萨布兰卡中,所有长时间运行或有可能阻塞的API都是异步的,例如:任何网络请求的API。PPL任务用于表示一些异步任务的完成。为了让卡萨布兰卡在VS2010和其他非windows平台也能使用,我们创建了一个特别版本的PPL任务并把它包含在卡萨布兰卡中。为了让它和PPL和平共处,我们把该版本命名为pplx
一个基于任务的操作可能会也可能不会立即结束。例如:当发送一个HTTP消息是,我们最后将得到一个消息响应。任务最后可得到这样的响应:

web::http::client::http_client client(U("http://localhost:80"));
pplx::task<web::http::http_response> resp = client.request(web::http::methods::GET, U("/foo.html"));

在这儿,任务resp为我们提供了一个将来会用到的值的占位符。只要你有一个任务,实际上,你就需要从这个任务中得到这个值。因为有可能操作完成的很快,任务所绑定的值很快就变得有效,所以有时候我们会去询问任务是否已经完成:

bool done = resp.is_done();

is_dong()返回true的时候,我们再用get()方法去取值,可以确保操作不会block(阻塞):

web::http::http_response response = resp.get(); 

如果is_done()返回false,调用'get()'将会导致阻塞线程,这样也就违背了在开始的位置使用异步API目的(保持GUI刷新和服务扩展)。对于这种情况,我们需要采取另外的途径:为任务绑定一个处理器函数,该函数在任务一结束时,就会被调用。我们使用then()函数:

resp.then([=] (web::http::http_response  response)
{
   ...
}); 

传递给一个任务的then()函数对象应该传入一个T或任务的参数:

resp.then([=](pplx::task<web::http::http_response> task)
{
    web::http::http_response  response = task.get();
    ...
}); 

因为我们知道任务已经完成,在回调函数里里调用get()绝对不会导致阻塞。

相关文章

  • 基于任务编程

    基于任务编程 在卡萨布兰卡中,所有长时间运行或有可能阻塞的API都是异步的,例如:任何网络请求的API。PPL任务...

  • C++多线程

    基于进程的多任务处理是程序的并发执行。 基于线程的多任务处理是同一程序的片段的并发执行。 c++多线程编程使用的是...

  • Gradle教程系列 —— 构建生命周期

    Gradle的核心是基于依赖的编程语言。这意味着我们可以定义任务和任务之间的依赖关系。Gradle保证这些任务按其...

  • 并发编程

    并发编程三种构造并发程序的方式:基于进程的并发编程、基于IO多路复用的并发编程、基于线程的并发编程1、 基于进程...

  • C++ REST SDK中的异步流

    目的 C++ REST SDK中的PPLX提供了基于任务的异步编程方案,基于PPLX又提供了异步流,用来将输入输出...

  • 「开源框架」RxJava(1)基本使用

    RxJava 异步任务响应式编程,基于观察者模式;Android 项目中使用 RxJava 需要添加依赖 RxAn...

  • 网络编程

    网络 Socket 基于TCP协议的Socket编程 基于UDP协议的Socket编程

  • ebookcoin中出现的异步编程浅析

    前言 node的核心编程思想是异步编程,ebookcoin是基于node开发的,ebookcoin的异步编程是基于...

  • GCD解析

    GCD是属于系统级别的线程管理,在Dispatch queue中执行需要执行的任务,性能非常高·基于队列的并发编程...

  • 从redis到分布式架构,通过Redis学AKF划分原则、CAP

    基于SpringBoot AOP面向切面编程实现Redis分布式锁基于SpringBoot AOP面向切面编程实现...

网友评论

      本文标题:基于任务编程

      本文链接:https://www.haomeiwen.com/subject/lkrzbttx.html