Od jakiegoś czasu próbowałem uzyskać coś, co moim zdaniem byłoby proste przy pracy z .NET 4.5
Chcę odpalić dwa długotrwałe zadania w tym samym czasie i zebrać
wyniki w najlepszy sposób C # 4.5 (RTM)
Poniższe działa, ale mi się to nie podoba, ponieważ:
- Chcę
Sleep
być metodą asynchroniczną, aby mogła miećawait
inne metody - Po prostu wygląda niezdarnie
Task.Run()
- Nie sądzę, żeby to w ogóle korzystało z nowych funkcji językowych!
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;
}
Niedziałający kod:
Aktualizacja: To faktycznie działa i jest właściwy sposób, aby to zrobić, jedynym problemem jest Thread.Sleep
Ten kod nie działa, ponieważ wywołanie Sleep(5000)
natychmiast uruchamia zadanie, więc Sleep(1000)
nie jest uruchamiane, dopóki nie zostanie ukończone. To prawda, mimo że Sleep
jest async
i nie używam await
ani nie dzwonię.Result
zbyt wcześnie.
Pomyślałem, że może istnieje sposób, aby Task<T>
wywołać async
metodę niedziałającą , wywołując metodę, aby móc następnie wywołać Start()
dwa zadania, ale nie mogę dowiedzieć się, jak uzyskać a 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;
}
task1.Result
nie o godzinie, var task1 = Sleep(5000)
ponieważ metoda uśpienia bez słowa kluczowego await jest synchroniczna.