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