Cela fait un moment que j'essaie de faire fonctionner quelque chose que je croyais simple avec .NET 4.5.
Je veux lancer deux tâches à long terme en même temps et collecter les données de l'enquête.
résultats dans la meilleure façon C# 4.5 (RTM)
Ce qui suit fonctionne mais je ne l'aime pas parce que.. :
- Je veux
Sleep
pour être une méthode asynchrone afin qu'elle puisseawait
autres méthodes - Cela semble juste maladroit avec
Task.Run()
- Je ne pense même pas que cela utilise de nouvelles fonctionnalités du langage !
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 en fait et c'est la bonne façon de 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 de sorte que Sleep(1000)
ne s'exécute pas tant qu'elle n'est pas terminée. Ceci est vrai même si Sleep
es async
et je n'utilise pas await
ou en appelant .Result
trop tôt.
J'ai pensé qu'il y avait peut-être un moyen de faire en sorte qu'une personne qui ne fonctionne pas Task<T>
en appelant un async
pour que je puisse ensuite appeler Start()
sur les deux tâches, mais je n'arrive pas à trouver comment obtenir une Task<T>
d'appeler 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;
}