在LINQ查询中突破Parallel.ForEach

OG *_*ude 4 .net linq-to-sql task-parallel-library

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

System.Data.SqlClient.SqlErrorCollection: Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.

如何让循环正常退出?通过ToList()在查询中添加say a 来强制本地集合是没有选择的.我也尝试将所有内容包装在一个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();
    }
});
Run Code Online (Sandbox Code Playgroud)

谢谢,

/大卫

Paw*_*hra 5

您可以使用CancellationTokenSource类实例来取消并行循环.有关更多信息:如何:取消Parallel.For或ForEach循环

这里要注意的重要一点是,当在并行循环内部调用取消令牌时,不会停止已经运行的迭代的执行.它只是不会启动任何新的迭代.

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

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