代码之家  ›  专栏  ›  技术社区  ›  Mrinal Kamboj

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

  •  2
  • Mrinal Kamboj  · 技术社区  · 11 年前

    我们在代码中广泛使用了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 callsaw是ParallelOptions的同一个实例,在我看来应该不错。

    这安全吗?这有效率吗?

    1 回复  |  直到 11 年前
        1
  •  5
  •   Henk Holterman    11 年前

    安全吗?

    对只要你不使用取消。

    这有效率吗?

    仅使用单独的实例(即放弃所有这些 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等。