2013-07-10 154 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());