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

在c#中同时运行同一方法的多个实例而不丢失数据?,c#,task-parallel-library,task,taskfactory,C#,Task Parallel Library,Task,Taskfactory,我真的不太理解任务和线程。 我想在不同的线程/任务中多次运行的的三层嵌套中有一个方法,但是我传递给该方法的变量变得疯狂,让我用一些代码解释一下: 列表编号=新列表(); 对于(int a=0;a检查中的语句。b和c从不递增 然后,您会遇到一个问题,这可能是其他问题的原因 检查您的语句。b和c从不递增 然后,您会遇到一个问题,这可能是其他问题的原因 问题是,您使用的变量已经或将要在/lambda之外修改。您应该会收到警告,说“访问修改的闭包” 您可以先将循环变量放入局部变量,然后使用这些变量来

我真的不太理解任务和线程。 我想在不同的线程/任务中多次运行的的三层嵌套
中有一个方法,但是我传递给该方法的变量变得疯狂,让我用一些代码解释一下:

列表编号=新列表();

对于(int a=0;a检查
中的
语句。
b
c
从不递增

然后,您会遇到一个问题,这可能是其他问题的原因


检查您的
语句。
b
c
从不递增

然后,您会遇到一个问题,这可能是其他问题的原因


问题是,您使用的变量已经或将要在/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
    }
  }
}
命名空间控制台应用程序9
{
使用System.Collections.Generic;
使用System.Threading.Tasks;
班级计划
{
静态void Main()
{
变量编号=新列表();

对于(int a=0;a而言,问题在于,您使用的变量已经或将在/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
    }
  }
}
命名空间控制台应用程序9
{
使用System.Collections.Generic;
使用System.Threading.Tasks;
班级计划
{
静态void Main()
{
变量编号=新列表();

对于(int a=0;a
myMethod
myMethod
?您正在将
int
传递给
myMethod
的第一个参数。
myMethod
列表作为第一个参数。当您的代码没有真正意义时,很难提供帮助。我的错误,已编辑并更正“这是嵌套,myMethod确实做了很多事情”.Methods不应该做很多事情,但有一件事。这会导致您遇到的问题。可能重复
myMethod
myMethod
?您正在将
int
传递给
myMethod
的第一个参数。
myMethod
列表作为第一个参数。当您的代码为d时,很难提供帮助oesn真的没有意义。我的坏,编辑和更正“这是巢,我的方法真的做了很多事情”.Methods不应该做很多事情,但有一件事。这是您遇到的问题的原因。非常感谢,这是一个完美的解决方案!这在C#5.0中也适用吗?我的理解是,闭包和变量捕获方面会有突破性的变化。@ChrisDunaway这种变化只适用于
foreach
。非常感谢,这是一个完美的解决方案!这是否也适用于C#5.0?我的理解是,关于闭包和变量捕获将有一个突破性的更改。@ChrisDunaway该更改仅适用于
foreach