【问题标题】:Same Result is getting override When executing multiple requests using Parallel.Foreach使用 Parallel.Foreach 执行多个请求时,相同的结果被覆盖
【发布时间】:2015-08-19 14:06:54
【问题描述】:

问题:使用 Parallel.Foreach 执行多个请求时,相同的结果被覆盖

我不断接受请求并使用任务工厂为每个请求启动一个新任务,然后使用Parallel.Foreach() 在多个处理器上执行这些请求(根据代码的逻辑)

--首先使用task.factory启动每个请求 Task.Factory.StartNew(() => ProcessProcessorsInParallel(e.ConfigKey, content));

--第二次执行从这里开始,每个请求都使用parallel.foreach执行,这里p.result被多个请求覆盖,得到相同的结果(p.result),这是不正确的。

    private void ProcessProcessorsInParallel(string configkey, string content)
    {  
       var processes = GetFLProcessor().Processors.Where(p => p.Enabled).ToList();
        Parallel.ForEach(processes, (p) =>
        {
            p.Process(content, configkey);
            var p1 = new PB();
          var result = CheckResponse.ParseFrom(Base64.decodeBase64(p.Result));
         }
    }

我应该在parallel.foreach 中使用锁吗?如果是,我如何实现并行性?

这里 Result(p.Result) 属性正在设置 Process 方法,我们正在尝试在此 Process 方法调用之后访问 Result 属性。对于多次请求,结果与多次请求相同。

Processor类和Process Method详细介绍如下:

public  class Processor
  {

 public string Result
    {
        get;
        set;
    }


 public void Process(string inputTrade, string key)
    {

     Result = RuleChecker.Check(inputTrade, new List<Type>() { 'ABC" }, previousTradeXml).ToByteString().ToBase64();

    }
  }

【问题讨论】:

  • 您能否在您尝试访问 Result 属性的位置添加代码?

标签: parallel-processing task-parallel-library parallel.foreach


【解决方案1】:

如果有任何并行化处理的范围,那么当您尝试执行 Parallel.Foreach() 时已经实现了并行性。但是,只有当您一次只允许一个线程进入代码的关键部分时,您的答案才是正确的(即与串行执行的答案相匹配)。

要实现这种互斥,您必须对共享资源使用锁。这些共享资源可能不限于数据结构,甚至可以是您的监视器,例如,如果您正在屏幕上打印某些内容。

如果您想要更具体的答案,请进一步更新您的问题。

【讨论】:

    猜你喜欢
    • 2023-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-23
    • 1970-01-01
    相关资源
    最近更新 更多