有没有一个简单的方法可以遍历 Parallel.ForEach 呢?什么是使用断点调试的最佳方式?
在调试期间,我经常将Parallel.ForEach
设置为使用MaxDegreeOfParallelism
设置为1。这样可以更轻松地进行调试。
const bool forceNonParallel = true;
var options = new ParallelOptions { MaxDegreeOfParallelism = forceNonParallel ? 1 : -1 };
Parallel.ForEach(collection, options, item =>
{ //...
与其他答案类似,我们在调试时将并行度设置为1,但是我们使用扩展方法实现此功能,例如:
public static ParallelQuery<TSource> AsDebugFriendlyParallel<TSource>(this IEnumerable<TSource> source)
{
var pQuery = source.AsParallel();
#if DEBUG
pQuery = pQuery.WithDegreeOfParallelism(1);
#endif
return pQuery;
}
然后,我们使用 .AsDebugFriendlyParallel()
替代使用 .AsParallel()
Parallel.ForEach()
和 IEnumerable<T>.AsParallel()
并不完全相同 - https://dev59.com/92865IYBdhLWcg3wfemU。 - sventevit如@PaulG所述,我认为最佳实践是将MaxDegreeOfParallelism
的值设置为1
。然后,通常Parallel
也会像普通循环(例如For
、Foreach
)一样工作。这是在Parallel
上进行调试的更快方法。因此,您不需要在常规循环和Parallel
之间切换代码。
Parallel.For(0, itemsList.Count, new ParallelOptions { MaxDegreeOfParallelism = 1 }, i =>
{
//your process goes here
}
暂时将其重写为非并行foreach,或使用预处理器指令在调试模式下执行非并行代码。
这是我使用的策略,使得在调试模式下每个循环都按顺序执行。
var parOpts = new ParallelOptions { MaxDegreeOfParallelism = -1 }; //No limit to parallel degree
#if DEBUG
parOpts.MaxDegreeOfParallelism = 1; //Set parallel to 1
#endif
Parallel.ForEach(links, node =>
{
string url = node.Attributes["href"].Value;
Link link = ParseLink(url);
link.LinkText = node.InnerText;
if (link.Domain == RootLink.Domain)
{
if (link.Page == RootLink.Page)
link.Type = LinkType.Section;
else
link.Type = LinkType.Internal;
}
else
link.Type = LinkType.External;
linksList.Add(link);
});