Uruchom równolegle dwa zadania asynchroniczne i zbierz wyniki w .NET 4.5
Próbowałem przez chwilę uzyskać coś, co wydawało mi się proste w pracy z .NET 4.5
Chcę odpalić dwa długie zadania w tym samym czasie i zebrać
skutkuje najlepszym sposobem C # 4.5 (RTM)
Poniższe działa, ale nie podoba mi się, ponieważ:
chcęSleep
być metodą asynchroniczną, więc możeawait
inne metodyPo prostu wygląda niezgrabnieTask.Run()
Nie sądzę, żeby to w ogóle wykorzystywało jakiekolwiek nowe funkcje językowe!Kod roboczy:
public static void Go()
{
Console.WriteLine("Starting");
var task1 = Task.Run(() => Sleep(5000));
var task2 = Task.Run(() => Sleep(3000));
int totalSlept = task1.Result + task2.Result;
Console.WriteLine("Slept for a total of " + totalSlept + " ms");
}
private static int Sleep(int ms)
{
Console.WriteLine("Sleeping for " + ms);
Thread.Sleep(ms);
Console.WriteLine("Sleeping for " + ms + " FINISHED");
return ms;
}
Nie działający kod:
Aktualizacja: To rzeczywiście działa i jest to właściwy sposób, jedynym problemem jestThread.Sleep
Ten kod nie działa z powodu wywołaniaSleep(5000)
natychmiast uruchamia zadanie takSleep(1000)
nie działa dopóki się nie zakończy. To prawda, chociażSleep
jestasync
i nie używamawait
lub dzwoniąc.Result
zbyt wcześnie.
Myślałem, że może jest jakiś sposób na uruchomienieTask<T>
dzwoniąc doasync
więc mogę zadzwonićStart()
w dwóch zadaniach, ale nie mogę wymyślić, jak uzyskaćTask<T>
od wywołania metody asynchronicznej.
public static void Go()
{
Console.WriteLine("Starting");
var task1 = Sleep(5000); // blocks
var task2 = Sleep(1000);
int totalSlept = task1.Result + task2.Result;
Console.WriteLine("Slept for " + totalSlept + " ms");
}
private static async Task<int> Sleep(int ms)
{
Console.WriteLine("Sleeping for " + ms);
Thread.Sleep(ms);
return ms;
}