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)
谢谢,
/大卫
您可以使用CancellationTokenSource类实例来取消并行循环.有关更多信息:如何:取消Parallel.For或ForEach循环
这里要注意的重要一点是,当在并行循环内部调用取消令牌时,不会停止已经运行的迭代的执行.它只是不会启动任何新的迭代.
还有其他方法可以使用ParallelLoopState类的Break()和Stop()方法来中断/停止并行循环.初始化Parallel.For/ForEach循环时,您可以传递ParallelLoopState类的实例并使用该实例来调用Break/Stop方法.
Break方法与Stop略有不同.在Stop的情况下,框架请求尽快停止迭代.使用Break,框架请求循环尽快停止执行当前迭代之外的迭代.如果您正在寻找特定的键/文本,并且想要在找到后突破,那么您应该使用Stop()方法.
归档时间: |
|
查看次数: |
1685 次 |
最近记录: |