我正在使用 Parallel.ForEach 遍历 LINQ to SQL 映射。一旦处理了一定数量的元素,我就会跳出循环。处理停止,但循环会在出现错误之前挂起几秒钟:
System.Data.SqlClient.SqlErrorCollection: Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.
如何让循环正常退出?通过在查询中附加 say ToList() 来强制本地集合是没有选择的。我还尝试将所有内容都包装在 using 块中,但无济于事。请注意,该

这是代码:

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

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

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

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

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

10-13 06:46