2013-07-10 4 views
0

나는 작동하는 응용 프로그램을 가지고 있으며 반복되는 반복 횟수의 루프가 있습니다. 이 루프에는 하나의 함수 호출이 있습니다. 그런 다음 함수를 별도의 스레드로 실행하도록 프로그램을 변경하려고했습니다. 나는 단위 테스트를 실행하도록 설정하고 응용 프로그램은 작업을 완료하기 전에 실행을 중지합니다.C# TPL 응용 프로그램의 실행이 중지됩니다.

하나의 스레드에서 하나의 반복 및 디버그를하도록 루프를 설정했습니다. 이 함수는 항상 같은 줄에있는 것이 아니라 함수의 상단 근처에서 실행을 멈추지 만 데이터 테이블과 데이터 행이있는 개체의 복사본을 만들려는 동일한 영역에서 각 스레드에서 선택 항목을 변경할 수 있습니다. 다음 코드는이 영역에서 디버깅 할 때 일관되게 멈추지 만 도착한 행은 다양합니다.

// main thread called by unit test 
... 
for(... 
{ 
    Task compute = Task.Factory.StartNew(() => results.Add(Compute(originalObject))); 
} 
... 
private ReturnObject Compute(MyObject originalObject) 
{ 
    ... 
    // near top of function after some assignment statements 
    // of some string and boolean variables 
    MyObject myObject = originalObject.Copy; 
    // never makes it to the next line 
    ... 
} 

// MyObject class 

private MyObject(DataTable dtTable) 
{ 
    _dataService = new DataService(); 
    _dataTable = dtTable.Copy(); 
    _dataRows = _dataTable.Select(); 
} 

public MyObject Copy() 
{ 
    MyObject copy = new MyObject(_dtTable); 
    return copy; 
} 

// DataService class 

public DataService() 
{ 
    _oleDbConnection = null; 
} 
+0

진입 점은 어떻게 생겼습니까? 내 생각 엔이 응용 프로그램은 엔트리 포인트 코드가 완료되는 즉시 종료되는 콘솔 앱입니다. 그러나 그것은 코드를 보지 않고 그냥 추측입니다. –

답변

2

당신은 완료가 만든 작업 Wait에 표시되지 않습니다 : 당신이 Wait 메서드를 호출하거나 작업이 완료 될 때까지 호출 스레드를 차단하는 일반적인 작업의 Result 속성을 액세스해야하거나, 시도 다음 :

var tasks = new List<Task>(); 
for ... 
{ 
    Task compute = Task.Factory.StartNew(() => results.Add(Compute(originalObject))); 
    tasks.Add(compute); 
} 

Task.WaitAll(tasks.ToArray()); 
관련 문제