J'essaie depuis un moment d'obtenir quelque chose que je pensais être simple de travailler avec .NET 4.5
Je veux lancer deux tâches longues en même temps et collecter les
résultats de la meilleure façon C # 4.5 (RTM)
Ce qui suit fonctionne mais je n'aime pas ça parce que:
- Je veux
Sleepêtre une méthode asynchrone pour pouvoirawaitutiliser d'autres méthodes - Ça a l'air maladroit avec
Task.Run() - Je ne pense même pas que cela utilise de nouvelles fonctionnalités linguistiques!
Code de travail:
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;
}
Code non fonctionnel:
Mise à jour: cela fonctionne réellement et c'est la bonne façon de le faire, le seul problème est le Thread.Sleep
Ce code ne fonctionne pas car l'appel à Sleep(5000)lance immédiatement la tâche en cours d'exécution et Sleep(1000)ne s'exécute donc pas tant qu'elle n'est pas terminée. C'est vrai même si Sleepc'est le cas asyncet je n'utilise pas awaitou n'appelle pas .Resulttrop tôt.
J'ai pensé qu'il y avait peut-être un moyen d'obtenir un non-en cours Task<T>d' exécution en appelant une asyncméthode afin que je puisse ensuite appeler Start()les deux tâches, mais je ne peux pas comprendre comment obtenir un en Task<T>appelant une méthode asynchrone.
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.Resultpas à var task1 = Sleep(5000)car votre méthode Sleep sans mot-clé d'attente est synchrone.