使用Parallel.Foreach执行多个请求时,相同的结果是获取覆盖

时间:2015-08-19 14:06:54

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

问题:使用Parallel.Foreach

执行多个请求时,获取覆盖的结果相同

我不断接受请求并使用Task Factory为每个请求启动新任务,然后使用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中使用lock吗?如果是,我怎么能实现并行?

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

处理器类和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();

    }
  }

1 个答案:

答案 0 :(得分:0)

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

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

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