Ich habe eine Zeit lang versucht, etwas zu bekommen, dachte ich würde einfach sein Arbeits .NET 4.5Run zwei Asynchron-Aufgaben parallel und sammle Ergebnisse in .NET 4.5
Ich möchte zwei lange laufenden Aufgaben abzufeuern zur gleichen Zeit und sammeln sie die
Ergebnisse in der besten C# 4.5 (RTM) Art und Weise
folgende funktioniert, aber ich mag es nicht, weil:
- ich
Sleep
will so eine Asynchron-Methode sein, es kannawait
Oth er Methoden - Es sieht einfach ungeschickt mit
Task.Run()
- Ich glaube nicht, dass dies sogar ü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;
}
Nichtarbeitscode:
Update: Das funktioniert tatsächlich und ist der richtige Weg, es zu tun, das einzige Problem ist die Thread.Sleep
Dieser Code funktioniert nicht, weil der cal l bis Sleep(5000)
startet die Task sofort, so dass Sleep(1000)
nicht ausgeführt wird, bis sie abgeschlossen ist. Das ist richtig, obwohl Sleep
async
ist und ich nicht await
oder rufen .Result
zu früh verwenden.
Ich dachte, vielleicht gibt es eine Möglichkeit, eine bekommen nicht laufenden Task<T>
durch eine async
Methode aufrufen, damit ich dann Start()
auf die beiden Aufgaben nennen könnte, aber ich kann nicht herausfinden, wie man eine Task<T>
bekommen von einem Asynchron-Aufruf Methode.
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;
}
Anmerkung: Herstellung Go ein asynchrones Verfahren keinen Unterschied macht –
-Block geschieht auf ' task1.Result 'nicht bei' var task1 = Sleep (5000) 'weil deine Sleep-Methode ohne await-Schlüsselwort ist synchron. – Arvis