2016-11-29 11 views
0

오늘은 문제가 발생하여 설명 할 수 없습니다. 메서드를 호출하는 작업이 있지만 정수 매개 변수가 값 형식처럼 처리되지 않는 것 같습니다.예기치 않은 동작의 작업 및 .NET의 정수

나는 간단한 설정에서 재현 할 수 :

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Start(); 
     } 

     private static void Start() 
     { 
      int numberThreads = 3; 

      for (int i = 0; i < numberThreads; i++) 
      { 
       if (i == 3) 
       { 
        // Never gets hit 
        System.Diagnostics.Debugger.Break(); 
       } 
       Task.Run(() => DoWork(i)); 
      } 
     } 

     private static void DoWork(int index) 
     { 
      if (index == 3) 
      { 
       // index = 3 
       System.Diagnostics.Debugger.Break(); 
      } 
     } 
    } 
} 

은, DoWork의 (인덱스 == 3)() 항상 true (I == 3) 시작에서() 결코 사실의 유효성을 확인하지 않습니다. 어떻게 가능합니까?

+3

'if (i == 3)'이 (가) 왜 안 맞았는지 알고 싶습니까? 그것은 for 루프가 0에서 시작하기 때문입니다. for (int i = 1; i RandomStranger

+0

도움이되지 않습니다 - 조건을'<'에서'<='으로 변경해야합니다. –

+0

@James, 네, 그건 이상한 것입니다. – FrankyHollywood

답변

4

여기에 변수을 가져 왔기 때문에 Thats가 발생하지만 작업이 즉시 시작되지 않고 FOR 루프가 해당 작업을 실행하기 전에 변경할 수 있기 때문에 발생합니다. 그 이유는 당신이 내가 할 수있는 작업 = 3 내부 작업.

for (int i = 0; i < numberThreads; i++) 
{ 
    if (i == 3) 
    { 
     // Never gets hit 
     System.Diagnostics.Debugger.Break(); 
    } 
    Task.Run(() => DoWork(i)); <= action will executed after we exited from for loop 
} 

자세한 내용은 pls는 여기 Captured variable in a loop in C#

을보고이 글 http://csharpindepth.com/Articles/Chapter5/Closures.aspx

+0

이 답변을 얻으려면 더 자세한 설명이 필요하거나 실제 문제. 기본적으로 OP 코드의 사본입니다. – ColinM

+2

@ColinM OP 코드를 설명하려고 했으므로 복사해야했습니다. – tym32167

-2

을 읽을 수 advicing ofcource "i"가 코드에서 3 같을 수 없다. 당신은 3 개 스레드를 받아 4

int numberThreads = 4; 

또는

변화에 루프 구문을 스레드 더 증가하지 않습니다 수 있습니다.

int numberThreads = 3; 
for (int i = 0; i <= numberThreads; i++) 

옵션 2는 귀하의 경우 더 논리적입니다.

+0

이것이 첫 번째 중단 점에 도달하는 동안 실제 질문에 대한 대답은 아닙니다. –