2014-10-23 6 views
0

Я работаю над консольным приложением C#, которое будет отвечать за запуск множества задач. Базовая структура для этого заключается в следующем:wait task in another task

var tasks = workItems.Select(x => Task.Factory.StartNew(() => 
{ 
    DoSomeWork(x); 
})).ToArray(); 

Task.WaitAll(tasks); 

Проблема заключается в том, что DoSomeWork() представляет собой метод, который ожидает асинхронной результат другой задачи, которая также нуждается в ожидании вызова к API Facebook. http://facebooksdk.net/docs/reference/SDK/Facebook.FacebookClient.html#GetTaskAsync(string)

public async void DoSomeWork(WorkItem item) 
{ 
    var results = await GetWorkData(); 
} 

public async Task<List<WorkData>> GetWorkData() 
{ 
    var fbClient = new FacebookClient(); 
    var task = fbClient.GetTaskAsync("something"); 
    var fbResults = await task; 
}; 

Я думал, что я мог бы поддержать это понятие вложенных задач с вызовом Task.WaitAll(), но исполнение родительских задач заканчивается почти сразу. Помещение Console.ReadLine() в конце приложения для предотвращения его раннего запуска показывает, что результат действительно вернется позже из Facebook.

Я пропустил что-то очевидное или есть лучший способ блокировать мою коллекцию задач, которая позволит использовать этот сценарий?

ответ

6

DoSomeWork не нужно возвращать void. Не возвращая Task, вызывающий абонент не знает, когда это произойдет.

Кроме того, он уже асинхронный, поэтому нет причин использовать StartNew здесь. Просто позвоните DoSomeWork напрямую, так как он должен возвращать Task.

+0

Спасибо за быстрый ответ, который должен был быть легким. Чувствуя себя немного ржавым здесь хаха –