gpt4 book ai didi

c# - Parallel.ForEach 或 Task.WhenAll 涉及异步操作时?

转载 作者:太空宇宙 更新时间:2023-11-03 22:30:13 26 4
gpt4 key购买 nike

<分区>

我读过 following密切相关的线程,但我想问一个更具体的问题。

如果我们需要异步运行任务/方法,并且这些任务本身运行其他任务/等待其他任务,首选哪种变体 - Parallel.ForEachTask.WhenAll?我将在下面用一些代码进行演示:

public async Task SomeWorker(string param1, HttpClient client,
List<FillMeUp> emptyCollection)
{
HttpRequestMessage message = new HttpRequestMessage();
message.Method = HttpMethod.Get;
message.Headers.Add("someParam", param1);
message.RequestUri = new Uri("https://www.somesite.me");
var requestResponse = await client.SendAsync(message).ConfigureAwait(false);
var content = await requestResponse.Content.ReadAsStringAsync()
.ConfigureAwait(false);
emptyCollection.Add(new FillMeUp()
{
Param1 = param1
});
}

WhenAll 一起使用:

using (HttpClient client = new HttpClient())
{
client.DefaultRequestHeaders.Add("Accept", "application/json");

List<FullCollection> fullCollection = GetMyFullCollection();
List<FillMeUp> emptyCollection = new List<FillMeUp>();
List<Task> workers = new List<Task>();
for (int i = 0; i < fullCollection.Count; i++)
{
workers.Add(SomeWorker(fullCollection[i].SomeParam, client,
emptyCollection));
}

await Task.WhenAll(workers).ConfigureAwait(false);

// Do something below with already completed tasks
}

或者,以上所有内容都写在 Parallel.ForEach() 中:

using (HttpClient client = new HttpClient())
{
client.DefaultRequestHeaders.Add("Accept", "application/json");

List<FullCollection> fullCollection = GetMyFullCollection();
List<FillMeUp> emptyCollection = new List<FillMeUp>();
Parallel.ForEach<FullCollection>(fullCollection, (fullObject) =>
{
HttpRequestMessage message = new HttpRequestMessage();
message.Method = HttpMethod.Get;
message.Headers.Add("someParam", fullObject.SomeParam);
message.RequestUri = new Uri("https://www.somesite.me");
var requestResponse = client.SendAsync(message)
.GetAwaiter().GetResult();
var content = requestResponse.Content.ReadAsStringAsync()
.GetAwaiter().GetResult();
emptyCollection.Add(new FillMeUp()
{
Param1 = fullObject.SomeParam
});
});
}

我知道列表不是线程安全的。这只是为了证明我的问题的性质。

HttpClient 的两种方法(SendAsyncReadAsStringAsync)都是异步的,因此必须同步调用才能使用 Parallel.ForEach.

这是否优于 Task.WhenAll 路线?我已经尝试了各种性能测试,但似乎找不到任何区别。

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