Mri*_*boj 2 c# parallel-processing multithreading task-parallel-library parallel.foreach
我们在代码中广泛使用了Parallel.Foreach,我们唯一的挑战是如何在DEBUG模式下使用可视调试使其成为串行,以下是我们正在做的,请分享您的观点:
public static class ParallelOptionsWrapper
{
// Private instance of ParallelOptions
private static readonly ParallelOptions @ParallelOptions;
// Private constructor
static ParallelOptionsWrapper()
{
@ParallelOptions = new ParallelOptions();
#if DEBUG
// 1 is sequential
@ParallelOptions.MaxDegreeOfParallelism = 1;
#else
// -1 is unlimited
@ParallelOptions.MaxDegreeOfParallelism = -1;
#endif
}
public static ParallelOptions Instance() { return @ParallelOptions; }
}
Run Code Online (Sandbox Code Playgroud)
以下是用法:
Parallel.ForEach(EnumerableList, ParallelOptionsWrapper.Instance(), element =>
{
// Code to run in Parallel
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,所有Parallel.Foreach调用都具有ParallelOptions的相同实例,在我看来应该没问题.
这样安全吗?这有效吗?
安全吗?
是.只要你不使用取消.
这有效吗?
只不过是使用单独的实例(即丢弃所有这些static东西).
所以这是可接受的边界,但肯定不是一个好的做法.
所有你需要的是 :
public static ParallelOptions StandardParallelOptions()
{
otions = new ParallelOptions();
#if DEBUG
// 1 is sequential
options.MaxDegreeOfParallelism = 1;
#else
// -1 is unlimited
options.MaxDegreeOfParallelism = -1;
#endif
return options; // separate instance for each loop
}
Run Code Online (Sandbox Code Playgroud)
这将允许设置CancellationToken等.
| 归档时间: |
|
| 查看次数: |
721 次 |
| 最近记录: |