gpt4 book ai didi

.net - 通过 LINQ 查询突破 Parallel.ForEach

转载 作者:行者123 更新时间:2023-12-03 03:46:00 27 4
gpt4 key购买 nike

我正在使用 Parallel.ForEach 循环 LINQ to SQL 映射。一旦处理了一定数量的元素,我就会跳出循环。处理停止,但循环挂起几秒钟,然后出现错误:

System.Data.SqlClient.SqlErrorCollection:超时已过期。操作完成之前超时时间已过,或者服务器没有响应。

如何让循环正常退出?通过将 ToList() 附加到查询来强制本地集合是不可行的。我还尝试将所有内容包装在 using block 中,但无济于事。请注意,

这是代码:

var query = SomeDataContext.SomeTableMapping; // All ok, if I append Take(maxRecords)
int maxRecords = 1000;
Parallel.ForEach(query, (queryResult, pLoopState, idx) =>
{
// Do whatever here on queryResult.
if (idx > maxRecords)
{
Console.WriteLine("Reached maximum number of records: {0}", maxRecords);
pLoopState.Break();
}
});

谢谢

/大卫

最佳答案

您可以使用 CancellationTokenSource 类实例来取消并行循环。了解更多:How to: Cancel a Parallel.For or ForEach Loop

这里需要注意的重要一点是,当并行循环内调用取消标记时,已经运行的迭代的执行不会停止。只是不会开始任何新的迭代。

还有其他方法可以使用 ParallelLoopState 类的 Break() 和 Stop() 方法来中断/停止并行循环。初始化 Parallel.For/ForEach 循环时,您可以传递 ParallelLoopState 类的实例并使用该实例调用 Break/Stop 方法。

Break 方法的行为与 Stop 略有不同。如果发生停止,框架请求尽快停止迭代。通过 Break,框架请求循环尽快停止当前迭代之外的迭代的执行。如果您正在寻找特定的键/文本并且希望在找到后突破,那么您应该使用 Stop() 方法。

关于.net - 通过 LINQ 查询突破 Parallel.ForEach,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8310447/

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