async/await
✍ dations ◷ 2024-12-25 22:54:55 #async/await
在程序设计中,async/await模式是C#5.0、Python3.5中、Hack、Dart以及Kotlin 1.1的一个特性。
在C#中,await运算符在异步方法任务中使用,用于在方法的执行过程中插入挂起点,直到所等待的任务完成。await仅可用于由async关键字修饰的异步方法中。
以下是用于从一个URL上下载data。
public async Task<int> SumPageSizesAsync(IList<Uri> uris) { int total = 0; foreach (var uri in uris) { statusText.Text = string.Format("Found {0} bytes ...", total); var data = await new WebClient().DownloadDataTaskAsync(uri); total += data.Length; } statusText.Text = string.Format("Found {0} bytes total", total); return total;}
在JavaScript中的使用
JavaScript中的await只能在异步(async function)中使用,用于等待一个Promise对象。当await接收到一个Promise对象时,await将等待Promise任务正常完成并返回其结果。若await接收到的不是Promise,await会把该其值转换为已正常处理的Promise,然后等待其工作完成。
function resolveAfter2Seconds(x) { return new Promise(resolve => setTimeout(() => resolve(x), 2000));}(async () => { const x = await resolveAfter2Seconds(10); console.log(x); // 输出10})();
在C++中的使用
C++20草案官方已确认支持await功能(命名为co_await)。目前,MSVC和clang已支持co_await,gcc 10也添加了对co_await的实验性支持。
#include <future>#include <iostream>using namespace std;future<int> add(int a, int b){ int c = a + b; co_return c;}future<void> test(){ int ret = co_await add(1, 2); cout << "return " << ret << endl;}int main(){ auto fut = test(); fut.wait(); return 0;}