在c#中同时运行同一方法的多个实例而不丢失数据?

时间:2013-03-04 14:45:57

标签: c# task-parallel-library task taskfactory

我真的不明白任务和线程。 我在嵌套for的三个级别中有一个方法,我希望在不同的线程/任务中多次运行,但是我传递给方法的变量变得疯狂,让我用一些代码解释一下:

List<int> numbers=new List<int>();
for(int a=0;a<=70;a++)
{
  for(int b=0;b<=6;b++)
  {
    for(int c=0;b<=10;c++)
    {
        Task.Factory.StartNew(()=>MyMethod(numbers,a,b,c));
    }
  }
}
private static bool MyMethod(List<int> nums,int a,int b,int c)
{
    //Really a lot of stuff here
}

这是嵌套,myMethod确实做了很多事情,比如计算一些数字的阶乘,写入不同的文档,将响应与组合列表匹配并调用其他小方法,它还有一些返回值(布尔值),但我现在不在乎它们。 问题是没有任务达到目的,就像每次嵌套调用它自己刷新的方法一样,删除以前的实例。 它还会给出一个错误,“尝试除以0”,其值超过由FORs分隔的值,例如a=71, b=7, c=11,并且所有变量都为空(这就是为什么除以零)。我真的不知道如何解决它。

2 个答案:

答案 0 :(得分:6)

问题是,您正在使用已经或将要在closure / lambda之外修改的变量。您应该收到警告,说“访问修改后的闭包”。

您可以先将循环变量放入本地变量并使用它们来修复它:

namespace ConsoleApplication9
{
  using System.Collections.Generic;
  using System.Threading.Tasks;

  class Program
  {
    static void Main()
    {
      var numbers = new List<int>();

      for(int a=0;a<=70;a++)
      {
        for(int b=0;b<=6;b++)
        {
          for(int c=0;c<=10;c++)
          {
            var unmodifiedA = a;
            var unmodifiedB = b;
            var unmodifiedC = c;

            Task.Factory.StartNew(() => MyMethod(numbers, unmodifiedA, unmodifiedB, unmodifiedC));
          }
        }
      }
    }

    private static void MyMethod(List<int> nums, int a, int b, int c)
    {
      //Really a lot of stuffs here
    }
  }
}

答案 1 :(得分:3)

检查您的for声明。 <{1}}和b永远不会增加。

然后你有一个closure over the loop variables可能是其他问题的原因。

Captured variable in a loop in C#

Why is it bad to use an iteration variable in a lambda expression