1

タスクとスレッドがよくわかりません。ネストされた 3 つのレベル内に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、いくつかの数値の階乗を計算したり、さまざまなドキュメントに書き込んだり、応答を組み合わせのリストと照合したり、他の小さなメソッドを呼び出したりするなど、実際には多くのことを行います。いくつかの戻り値 (ブール値) もありますが、私は現時点では気にしないでください。問題は、タスクが終了しないことです。ネストがメソッドを呼び出すたびに、それ自体がリフレッシュされ、以前のインスタンスが削除されます。また、FOR で区切られた値を超える値、たとえばa=71, b=7, c=11、すべての変数が空 (ゼロで割った理由) で、「0 で除算を試みてください」というエラーが表示されます。私はそれを解決する方法を本当に知りません。

4

2 に答える 2

6

問題は、クロージャ/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
    }
  }
}
于 2013-03-04T14:58:39.830 に答える
3

forあなたの声明を確認してください。増加することはありませんbc

次に、他の問題の原因となる可能性が高いループ変数を閉じます。

C# のループでキャプチャされた変数

ラムダ式で反復変数を使用するのが悪いのはなぜですか

于 2013-03-04T14:58:30.670 に答える