Arc*_*ian 16 c# debugging parallel.foreach
有没有一种简单的方法可以逐步完成parallel.foreach?使用断点调试此方法的最佳方法是什么?
Ree*_*sey 31
在调试期间,我经常将我设置Parallel.ForEach为运行,MaxDegreeOfParallelism设置为1.这使得调试变得更加简单.
const bool forceNonParallel = true;
var options = new ParallelOptions { MaxDegreeOfParallelism = forceNonParallel ? 1 : -1 };
Parallel.ForEach(collection, options, item =>
{ //...
Run Code Online (Sandbox Code Playgroud)
但是,这对调试与竞争条件或数据同步有关的问题没有帮助,实际上通常会隐藏或消除代码中的实际问题.
通过使用VS 2010中的新工具(例如" 并行任务"窗口)或使用调试多线程应用程序中列出的各种技术(例如切换线程,在步进时锁定线程等),可以更轻松地调试这些问题.
与此处的其他答案类似,我们在调试时将并行度设置为1,但我们使用扩展方法执行此操作,如:
public static ParallelQuery<TSource> AsDebugFriendlyParallel<TSource>(this IEnumerable<TSource> source)
{
var pQuery = source.AsParallel();
#if DEBUG
pQuery = pQuery.WithDegreeOfParallelism(1);
#endif
return pQuery;
}
Run Code Online (Sandbox Code Playgroud)
然后,而不是使用.AsParallel()我们使用.AsDebugFriendlyParallel()
小智 5
实际上,您可以通过冻结除一个线程之外的所有线程,在“线程”窗口中选择除一个线程之外的所有线程,然后右键单击 -> 像这样冻结:
此外,如果您想重现竞争条件并在断点处停止会破坏它,您可以随时添加跟踪点 - 无论是使用 Visual Studio 还是使用帮助它的插件,例如 Oz Code
正如@PaulG 回答的那样,我认为最佳实践是将MaxDegreeOfParallelism值设置为1。然后通常Parallel也会像常规循环一样工作,例如For, Foreach。这是在Parallel. 因此,您不需要在常规循环和Parallel.
Parallel.For(0, itemsList.Count, new ParallelOptions { MaxDegreeOfParallelism = 1 }, i =>
{
//your process goes here
}
Run Code Online (Sandbox Code Playgroud)