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



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

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

——首先使用task.factory启动每个请求Task.Factory.StartNew(() => ProcessProcessorsInParallel()

ConfigKey、内容));

——第二次执行从这里开始,每个请求都使用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吗?如果是,我如何实现并行?

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

处理器类和进程方法的详细信息如下:

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();
    }
  }

如果存在任何并行化处理的范围,那么当您尝试执行Parallel.Foreach()时,并行性已经实现。然而,只有当你一次只允许一个线程进入代码的临界区时,你的答案才会是正确的(即与串行执行的答案匹配)。

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

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