2013-03-04 1 views
1

나는 정말로 Tasks and Threads를 잘 이해하지 못한다. 내가 다른 스레드/작업에서 여러 번 실행하려는 중첩 for의 세 가지 수준의 내부 방법을 가지고,하지만 난 방법에 전달할 변수가 미쳐 날 일부 코드를 설명하자C#에서 데이터 손실없이 동일한 메소드의 인스턴스를 동시에 실행하십시오?

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으로 나눕니다."오류가 발생합니다. 예를 들어 a=71, b=7, c=11과 같이 모든 값이 비어있는 경우 (즉 0으로 나눈 경우) FORs로 구분 된 값 이상입니다. 나는 그것을 어떻게 해결할 지 정말로 모른다.

+1

'myMethod' 또는'MyMethod'을? 당신은'int'를'myMethod'의 첫 번째 매개 변수에 넘깁니다. 'MyMethod'는 첫 번째 매개 변수로 List 을 사용합니다. 코드가 실제로 이해가 안되면 도움이되기 어렵습니다. – spender

+0

나쁜, 편집 및 수정 –

+0

"이것은 둥지, myMethod 정말 많은 일을". 방법은 많은 일을해서는 안되지만, 한 가지. 이것은 당신이 가진 문제에 기여하고 있습니다. –

답변

6

이있다거나 closure/람다 외부 변형 한 것이다 변수를 사용하고 있다는 문제가있다. "변경된 접근 차단에 대한 액세스"라는 경고 메시지가 나타납니다.

먼저 지역 주민에 루프 변수를 넣어 그것을 해결하고 그 사용할 수 있습니다

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 
    } 
    } 
} 
+0

대단히 감사합니다. 완벽한 솔루션입니다! –

+0

C# 5.0에도 적용됩니까? 나의 이해는 클로저와 가변 캡쳐에 관한 급격한 변화가있을 것이라는 점이다. –

+0

@ChrisDunaway 변경 사항은 foreach에만 적용됩니다. – svick