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ę
Sleepbyć metodą asynchroniczną, aby mogła miećawaitinne 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 Sleepjest asynci nie używam awaitani nie dzwonię.Result zbyt wcześnie.
Pomyślałem, że może istnieje sposób, aby Task<T>wywołać asyncmetodę 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.Resultnie o godzinie, var task1 = Sleep(5000)ponieważ metoda uśpienia bez słowa kluczowego await jest synchroniczna.