140 votes

Exécuter deux tâches asynchrones en parallèle et collecter les résultats en .NET 4.5

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 puisse await 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;
}

2voto

Arvis Points 1945

C'est week-end maintenant !

    public async void Go()
    {
        Console.WriteLine("Start fosterage...");

        var t1 = Sleep(5000, "Kevin");
        var t2 = Sleep(3000, "Jerry");
        var result = await Task.WhenAll(t1, t2);

        Console.WriteLine($"My precious spare time last for only {result.Max()}ms");
        Console.WriteLine("Press any key and take same beer...");
        Console.ReadKey();
    }

    private static async Task<int> Sleep(int ms, string name)
    {
            Console.WriteLine($"{name} going to sleep for {ms}ms :)");
            await Task.Delay(ms);
            Console.WriteLine("${name} waked up after {ms}ms :(";
            return ms;
    }

0voto

Simon_Weaver Points 31141

Cet article a permis d'expliquer beaucoup de choses. Il est dans le style FAQ.

FAQ Async/Attente

Cette partie explique pourquoi Thread.Sleep s'exécute sur le même fil de discussion original - d'où ma confusion initiale.

Le mot-clé "async" fait-il en sorte que l'invocation d'une méthode soit placée dans la file d'attente de la le ThreadPool ? La création d'un nouveau thread ? Pour lancer une fusée vers Mars ?

Non. Non. Et non. Voir les questions précédentes. Le mot clé "async" indique au compilateur que "await" peut être utilisé à l'intérieur de la méthode méthode, de sorte que la méthode peut se suspendre à un point d'attente et voir son reprendre son exécution de manière asynchrone lorsque l'instance attendue se est terminée. C'est pourquoi le compilateur émet un avertissement s'il n'y a pas de "await" à l'intérieur d'une méthode. "awaits" à l'intérieur d'une méthode marquée comme "async".

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X