Ich habe eine Weile versucht, etwas zu bekommen, von dem ich dachte, dass es einfach wäre, mit .NET 4.5 zu arbeiten
Ich möchte zwei lange laufende Aufgaben gleichzeitig starten und die
Ergebnisse auf die beste C # 4.5 (RTM) -Methode sammeln
Folgendes funktioniert, aber ich mag es nicht, weil:
- Ich möchte
Sleep
eine asynchrone Methode sein, damit es auchawait
andere Methoden können - Es sieht nur ungeschickt aus
Task.Run()
- Ich denke nicht, dass dies überhaupt neue Sprachfunktionen verwendet!
Arbeitscode:
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;
}
Nicht funktionierender Code:
Update: Dies funktioniert tatsächlich und ist der richtige Weg, das einzige Problem ist das Thread.Sleep
Dieser Code funktioniert nicht, da der Aufruf zum Sleep(5000)
sofortigen Starten der ausgeführten Aufgabe Sleep(1000)
erst nach Abschluss ausgeführt wird. Dies ist wahr, obwohl es Sleep
ist async
und ich nicht benutzeawait
oder .Result
zu früh anrufe.
Ich dachte, es gibt vielleicht eine Möglichkeit, Task<T>
durch Aufrufen einer async
Methode eine Nicht-Ausführung zu erreichen , damit ich dann Start()
die beiden Aufgaben aufrufen kann, aber ich kann nicht herausfinden, wie ich Task<T>
durch Aufrufen einer asynchronen Methode eine erhalten kann.
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
nicht um, var task1 = Sleep(5000)
da Ihre Sleep-Methode ohne ein Schlüsselwort "wait" synchron ist.