2013-07-10 2 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()); 
Смежные вопросы