gpt4 book ai didi

c# - parallel.for 循环中的异步任务

转载 作者:行者123 更新时间:2023-11-30 20:00:02 24 4
gpt4 key购买 nike

我有一个异步方法是从下面的 Parallel.For 代码调用的。现在看看代码,它非常简单,除了 JsonParse 类有一个静态方法,它所做的就是调用 Web 服务来下载 json 字符串并将其转换为 PairResults 对象并返回。

我遇到的问题是 Parallel.For 循环永远不会退出,我可以清楚地看到数据来自网络调用“item.part1=data.value”,一切正常,但 updateAllResults永远不会完成。我做错了什么?

public void updateAllResults()
{
Parallel.For(0, PairList.Count(), (i) =>
{
var item = PairList[i];
var data = (Parse.JsonParse<PairResults>
.getJsonString("http://localhost:22354/"
+ item.Original)).Result;
item.part1 = data.value;
});
}

最佳答案

这是 Parallel.For 的反模式,因为您仅使用它来启动异步操作并阻止它们。这样,它将阻塞有限数量的池线程,并且实际的并行度可能比使用任务时低得多:

public void updateAllResults()
{
var tasks = PairList.Select(async (item) =>
{
var data = await Parse.JsonParse<PairResults>
.getJsonString("http://localhost:22354/" + item.Original).
.ConfigureAwait(false);

item.part1 = data.value;
});

Task.WaitAll(tasks.ToArray());
}

此外,您的问题被标记为 标签。如果您在 WinForms 应用程序中使用 Parallel.For 和上面的代码,它们都会阻塞您的 UI 线程。正确的解决方案是使用 Task.WhenAll:

public async Task updateAllResults()
{
var tasks = PairList.Select(async (item) =>
{
var data = await Parse.JsonParse<PairResults>
.getJsonString("http://localhost:22354/" + item.Original)
.ConfigureAwait(false);

item.part1 = data.value;
});

await Task.WhenAll(tasks.ToArray());
}

// button click handler
async void button_Click(object s, EventArgs e)
{
this.button.Enabled = false;
try
{
await updateAllResults()
}
finally
{
this.button.Enabled = true;
}
}

关于c# - parallel.for 循环中的异步任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22403856/

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