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 pouvoirawait
utiliser 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 Sleep
c'est le cas async
et je n'utilise pas await
ou n'appelle pas .Result
trop 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 async
mé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.Result
pas à var task1 = Sleep(5000)
car votre méthode Sleep sans mot-clé d'attente est synchrone.