在Parallel.Foreach中使用ParallelOptions在串行和并行操作之间切换

时间:2015-02-27 06:50:00

标签: c# multithreading parallel-processing 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; }
}

以下是用法:

Parallel.ForEach(EnumerableList, ParallelOptionsWrapper.Instance(), element =>
{
// Code to run in Parallel
}

在这种情况下,所有Parallel.Foreach个调用都具有相同的ParallelOptions实例,在我看来应该没问题。

这样安全吗?这有效吗?

1 个答案:

答案 0 :(得分:5)

  

安全吗?

是。只要你不使用取消。

  

效率这么高吗?

只不过是使用单独的实例(即丢弃所有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
}

这将允许设置CancellationToken等。