2014-09-09 7 views
9

У меня есть метод async, который возвращает строку (из Интернета).Добавление строки в StringBuilder из метода async

async Task<string> GetMyDataAsync(int dataId); 

У меня есть:

Task<string>[] tasks = new Task<string>[max]; 
for (int i = 0; i < max; i++) 
{ 
    tasks[i] = GetMyDataAsync(i); 
} 

Как я могу добавить результат каждой из этих задач в StringBuilder?

Я хотел бы знать, как сделать это

A) Для создания задачи

B) Для того, чтобы задачи закончить

Как я могу это сделать?

ответ

12

A) Для создания задачи

Task<string>[] tasks = new Task<string>()[max]; 
for (int i = 0; i < max; i++) 
{ 
    tasks[i] = GetMyDataAsync(i); 
} 
Task.WaitAll(tasks); 
foreach(var task in tasks) 
    stringBuilder.Append(task.Result); 

B) Для того, чтобы задачи закончить

Task<string>[] tasks = new Task<string>()[max]; 
for (int i = 0; i < max; i++) 
{ 
    tasks[i] = GetMyDataAsync(i).ContinueWith(t => stringBuilder.Append(t.Result)); 
} 
Task.WaitAll(tasks); 

Если вы внутри async метода вы можете также используйте await Task.WhenAll(tasks) вместо Task.WaitAll.

ВНИМАНИЕ:

  1. StringBuilder не поточно-: Is .NET's StringBuilder thread-safe ==> вы должны lock внутри в ContinueWith

  2. Как отметил Матиас: Вы должны также проверить, для успешной задачи завершение

+0

Спасибо. Именно то, что я искал. – Hooch

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