我很有趣。似乎Visual Studio 2012还不支持它(可能是未来的CTP?)。它在标准C 11 async库中是否具有等效?
目的是让您表达必须按顺序执行的异步任务。
例如,假设我正在GUI应用程序中。当用户按下按钮时,我想启动一个任务以在线检索文件,然后对其进行处理以检索某种数据,然后使用此数据更新GUI。在发生这种情况时,还有很多其他任务正在进行,主要是为了保持GUI响应。
这可以通过使用调用回调的回调来完成。与lambdas关联的.then()功能允许您编写实例化的所有回调内容(如果需要,仍然可以使用单独的回调)。它也不能保证每个单独任务的工作将由同一线程完成,如果初始线程已经有太多工作要做,则可以免费线程窃取任务。
.then(then()函数在C 11中不存在
klaim已经做了一个很好的答案,但是我想我给出一个特定的例子。
.then
将延续连接到任务,并且是等效于同步.get
的异步。
c 11具有std::future
,相当于concurrency::task
。std::future
当前仅具有.get
,但是有一个建议添加.then
(以及其他好东西)。
std::async(calculate_answer(the_question_of_everything))
.then([](std::future<int> f){ std::cout << f.get() << "n"; });
上面的摘要将创建一个异步任务(使用std::async
启动),然后附加连续性,该连续性在完成上述任务后立即通过完成任务的std::future
。这实际上返回了的另一个std::future
任务,而当前的C 11标准将阻止其击曲线,但是还有另一个建议可以使destructor unblocking tosloctor。因此,使用上述代码,您可以创建一个射击任务,该任务在计算后立即打印出答案。
等效的阻止是:
auto f = std::async(calculate_answer(the_question_of_everything));
std::cout << f.get() << "n";
此代码将在f.get()
中阻塞直到答案可用。