gpt4 book ai didi

c# - 为同步请求创建 .net 异步包装器

转载 作者:太空宇宙 更新时间:2023-11-03 11:02:04 27 4
gpt4 key购买 nike

我有以下情况(或者对async await机制的基本误解)。

假设您有一组需要很长时间的 1-20 网络请求调用:findItemsByProduct()。你想将它包装在一个异步请求中,这样可以将所有这些调用抽象为一个异步调用,但我似乎无法在不使用更多线程的情况下做到这一点。

如果我在做:

 int total = result.paginationOutput.totalPages;
for (int i = 2; i < total + 1; i++)
{

await Task.Factory.StartNew(() =>
{
result = client.findItemsByProduct(i);
});
newList.AddRange(result.searchResult.item);

}
}
return newList;

这里的问题是,调用不会一起运行,而是一个接一个地等待。我希望所有调用一起运行,而不是收获结果。

作为伪代码,我希望代码像这样运行:

forEach item {
result = item.makeWebRequest();
}
foreach item {
List.addRange(item.harvestResults);
}

虽然我不知道如何编写代码来做到这一点..

最佳答案

理想情况下,您应该添加一个 findItemsByProductAsync返回 Task<Item[]> .这样,您就不必使用 StartNew 创建不必要的任务。或 Task.Run .

那么你的代码可以是这样的:

int total = result.paginationOutput.totalPages;

// Start all downloads; each download is represented by a task.
Task<Item[]>[] tasks = Enumerable.Range(2, total - 1)
.Select(i => client.findItemsByProductAsync(i)).ToArray();

// Wait for all downloads to complete.
Item[][] results = await Task.WhenAll(tasks);

// Flatten the results into a single collection.
return results.SelectMany(x => x).ToArray();

关于c# - 为同步请求创建 .net 异步包装器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17301346/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com