2014-09-09 10 views
9

Mam metodę asynchroniczną, która zwraca ciąg (From web).Dodawanie ciągu znaków do StringBuilder z metody asynchronicznej

async Task<string> GetMyDataAsync(int dataId); 

mam:

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

Jak mogę dołączyć wynik każdego z tych zadań StringBuilder?

chciałbym wiedzieć jak to zrobić

a) w celu tworzenia zadań

B) Aby zakończyć zadania

Jak mogę to zrobić?

Odpowiedz

12

A) W celu utworzenia zadania

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) w kolejności zadań zakończyć

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); 

Jeśli jesteś wewnątrz metody async można również użyj await Task.WhenAll(tasks) zamiast Task.WaitAll.

UWAGA:

  1. StringBuilder nie jest bezpieczny wątku: Is .NET's StringBuilder thread-safe ==> należy lock Wewnątrz ContinueWith

  2. Jak wskazano Matias: Należy również sprawdzić udanego zadania zakończenie

+0

Dzięki. Dokładnie to, czego szukałem. – Hooch

Powiązane problemy