我见过create_task有几种使用方式:
void Bob()
{
create_task() { /* do stuff */ }.then([](){ /* do more stuff */ });
}
和
task<void> Bob()
{
return create_task() { /* do stuff */ }.then([](){ /* do more stuff */ });
}
为什么在使用任何一种方法都可以实现异步行为时,还是要回复任务(在第二个例子中)?
澄清:我不专门询问void返回类型。它可以是int,object或其他东西。
答案 0 :(得分:3)
void
/ task<void>
在这里是一个特殊情况,因为你可以从无处魔法void
。对于int
,std::string
或类似内容,您无法做同样的事情。
void Bob()
{
create_task() { /* do stuff */ }.then([](){ /* do more stuff */ });
}
此操作返回/* do stuff */
并且/* do more stuff */
已经开始,并且任何有关其进度的句柄都将被丢弃。
task<void> Bob()
{
return create_task() { /* do stuff */ }.then([](){ /* do more stuff */ });
}
此操作返回/* do stuff */
并且/* do more stuff */
已经启动,并且您有一个等待它们完成的句柄。
int Alice()
{
return create_task() { /* do stuff */ }.then([](){ /* do more stuff */ return 42; }).get();
}
此操作返回/* do stuff */
后/* do more stuff */
已完成,最终结果可用。
task<int> Alice()
{
return create_task() { /* do stuff */ }.then([](){ /* do more stuff */ return 42; });
}
此操作返回/* do stuff */
并且/* do more stuff */
已经启动,并且您有一个等待它们完成的句柄,并获得结果。