有没有一种简单的方法来逐步浏览parallel.foreach?使用断点进行调试的最佳方法是什么?
发布于 2015-08-06 17:12:14
实际上,你可以通过冻结除一个线程之外的所有线程,在线程窗口中选择除一个线程之外的所有线程,然后右键单击-> Freeze,这样就可以得到类似的结果:
此外,如果要重新生成争用条件,并且在断点处停止会破坏该条件,则始终可以添加跟踪点-无论是使用visual studio还是使用有助于该条件的插件,如Oz Code
发布于 2012-06-19 20:41:33
在调试过程中,我经常设置我的Parallel.ForEach
在MaxDegreeOfParallelism
设置为1的情况下运行,这使得调试变得非常简单。
const bool forceNonParallel = true;
var options = new ParallelOptions { MaxDegreeOfParallelism = forceNonParallel ? 1 : -1 };
Parallel.ForEach(collection, options, item =>
{ //...
但是,这无助于解决与竞态条件或数据同步相关的调试问题,实际上通常会隐藏或消除代码中的实际问题。
通过使用VS2010中的新工具,例如Parallel Tasks window,或者使用Debugging Multithreaded Applications中列出的各种技术,例如switching threads,在单步执行时锁定线程等,这些问题通常可以更容易地进行调试。
发布于 2014-03-27 10:42:01
与这里的其他答案类似,我们在调试时将并行度设置为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()
https://stackoverflow.com/questions/11108995
复制