2015-08-17 2 views
0

У меня есть этот код:task.Wait вызывает длительную паузу в моей GUI потоке

 public async Task<string> Solve(List<List<Node>> nodeList) 
    { 
     List<Task> taskList = new List<Task>(); 

     for (int i = 0; i < nodeList.Count(); i++) 
     { 
      int taskNo = i; 
      Task<List<Node>> task = Task.Factory.StartNew((x) => 
      { 
       List<Node> nodes = new List<Node>(nodeList[i]); 
       Calculate(nodes); 
       return nodes; 
      }, taskNo); 

      task.Wait(); 
      taskList.Add(task); 

     } 

     Task<string> r = BuildReport(taskList); 

     return r; 
    } 

Этот метод вызывается другим методом на моем UI потоке. Этот метод заставляет мой поток пользовательского интерфейса приостанавливаться и делает окно невосприимчивым в течение 20-50 секунд. У меня такое чувство. Подождите, пока эта пауза. Как мне изменить этот метод, чтобы этого не произошло. Если у меня нет задачи. Подождите, когда taskList не получит в нем правильные задачи.

Спасибо.

+1

Возможно, вызов вашей задачи из другого потока, кроме потока пользовательского интерфейса? –

+0

Вы 'ожидаете этого от вызывающего? – GEEF

+0

Пожалуйста, добавьте код вызова для задачи «Решить» – dpimente

ответ

3

Не делайте Wait свои задачи. Используйте await Task.WhenAll(taskList); Ваш код будет похож на это:

public async Task<string> Solve(List<List<Node>> nodeList) 
{ 
    List<Task> taskList = new List<Task>(); 

    for (int i = 0; i < nodeList.Count(); i++) 
    { 
     int taskNo = i; 
     Task<List<Node>> task = Task.Factory.StartNew((x) => 
     { 
      List<Node> nodes = new List<Node>(nodeList[taskNo]); //replace i with taskNo 
      Calculate(nodes); 
      return nodes; 
     }, taskNo); 

     // remove Wait 
     taskList.Add(task); 

    } 

    await Task.WhenAll(taskList); //Add this line 
    Task<string> r = BuildReport(taskList); 

    return r; 
} 

В текущем коде, вы создаете задачу, а затем ждать его, чтобы закончить. Это не сильно отличается от запуска вашего кода последовательно. Использование Task.WhenAll здесь имеет 2 преимущества. a) Ваши задачи будут выполняться параллельно. b) Поскольку мы находимся , ожидая, ваш пользовательский интерфейс не будет заблокирован.

+0

Ahh Я был так близко. Это сработало. Пользовательский интерфейс все еще немного меркнут, но я думаю, что смогу с этим справиться. Спасибо за помощь! – ashlar64

+0

Кроме того, с 'async-.await' используйте' Task.Run' вместо 'Task.Factory.StartNew': http://blogs.msdn.com/b/pfxteam/archive/2011/10/24/10229468. ASPX –

Смежные вопросы