gpt4 book ai didi

c# - 在 Parallel.Foreach 中调用方法并将结果保存到线程安全列表中

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

我有这段代码在单线程中运行良好

foreach (var meetingRoom in meetingRooms)
{
try
{
var res = calendarService.GetEvents(meetingRoom.Email, startUtc, endUtc, lightweight, limit);
result.AddRange(res);
}
catch (Exception ex)
{
Log.Error(ex);
}
}

但问题是 meetingRooms 列表包含超过 40000 个条目。我正在尝试接近 Parallel.Foreach - 这是我到目前为止所得到的:

Parallel.ForEach(meetingRooms, () => 0,(meetingRoom) =>
{
var res = calendarService.GetEvents(meetingRoom.Email, startUtc, endUtc, lightweight, limit);

}
,
finalResult =>
{
lock (result)
{
result.Add(finalResult);
}
});

我不太了解第四个参数 localFinally 的工作原理。

请注意,result 和 meetingRooms 是具有不同数据类型的列表。

编辑:

如其中一个答案所示,我实现了 PLINQ 解决方案。看起来它的工作,但 Exchange Web 服务 (EWS) 库没有实现并行调用它的方法之一。获取和错误“不是唯一的 key !”由 Microsoft 代码抛出。

最佳答案

您可以使用 PLinq。

result = meetingRooms
.AsParallel()
.Select(meetingRoom => calendarService.GetEvents(meetingRoom.Email, startUtc, endUtc, lightweight, limit) )
.ToList();

当您仍想使用 Parallel.ForEach() 时,使用 localFinally 的重载就没那么有用了。使用基础知识:

Parallel.ForEach(meetingRooms, meetingRoom =>
{
var res = calendarService.GetEvents(meetingRoom.Email, ...);

lock (result) // only OK when you don't lock on it anywhere else
{
result.Add(res);
}
});

关于c# - 在 Parallel.Foreach 中调用方法并将结果保存到线程安全列表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42293007/

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