C#TPL应用程序停止运行

时间:2013-07-10 15:04:02

标签: c#

我有一个正在运行的应用程序,并且循环具有可变数量的迭代。我在这个循环中有一个函数调用。然后我尝试更改程序以将该函数作为单独的线程启动。我设置了一个单元测试来运行,并且在完成任何工作之前应用程序停止运行。

我已经将循环设置为在一个线程上进行一次迭代和调试。它停止在函数顶部附近运行,并不总是在同一行上,而是在我尝试复制具有数据表和数据行的对象的同一区域,其中可以在每个线程中更改选择。以下是代码,它在此区域中调试时始终停止,但到达的行会有所不同。

// 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;
}

1 个答案:

答案 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());