C++中的std::async与C#中的async/await的区别

19

我想知道新的c++特性std::async是否与C#中的两个关键字async/await非常相似,如果不是,为什么?

2个回答

23

如果我正确理解了这个std::async文档,那么不是真的.

C# 5的async/await特性涉及异步方法的复杂编译器转换,使得您可以编写看起来几乎同步但仍存在异步点的代码。编译器为你构建状态机,创建适当的回调等。

编辑:尽管我以前认为std::async只是强制你显式地传递回调函数,但它似乎比这更原始一些。无论如何,我相信它大多数/完全是一个特性,而C# 5的异步方法主要是具有库支持的语言特性。

编辑:如评论中进一步指出的那样,看起来VC++也在朝这个方向发展...


1
但是在C++中,您可以使用协程作为库功能实现与C# 5的await相当的功能。证明:CppAwait - Valentin Milea
@Jon:在C#中,曾经有过使用yield操作符的类似工作,由Tomas PetricekJeffrey Richter完成。关于等价性 - 语法糖较少,但您可以获得大致相同的代码流程和异常处理优势。我确信,通过构建.NET TPL,C#肯定能做得更好。 - Valentin Milea
1
@ValentinMilea:正如我所说,我需要更仔细地查看细节以进行比较,但如果任何仅使用库的版本具有语言支持版本的所有优点,我会感到惊讶。 - Jon Skeet
2
以下概念验证表明,可以借助堆栈协程来模拟 await 特性的确切语法:await_emu - Evgeny Panasyuk
VC++现在也有了类似C#的await功能。请参见此链接:http://blogs.msdn.com/b/vcblog/archive/2013/12/20/asynchronous-programming-in-c-using-resumable-functions-and-await.aspx - Raman Sharma
显示剩余9条评论

1
CPPASYNC(在另一个答案中提供)看起来就是你要找的。 "Async" 部分很容易,性能也很好(可能比 C# 实现更好)。 它很丑陋,因为你需要在异步回调调用周围使用特殊的 "Await" 包装器。 提供了一些 Boost 网络,并且它们很容易制作,但你不能只是 "Await" 任何东西: 异步任何方法/函数, 在异步函数内部,等待以下任一内容: - 一个异步函数 - 一个异步函数(带有回调)周围的 "Await" 包装器(简单制作)。

2
我对这个答案感到非常困惑。我不知道你试图说什么。 - svick
我认为他的意思是CppAwait提供了类似于C#的async/await的功能,但你需要包装现有的异步API使其可等待(就像我为部分Boost.Asio所做的那样)。这不是正确的地方,因为问题是关于std::async的。 - Valentin Milea

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接