Le statut de la tâche des modifications à RanToCompletion si la Tâche attendent quelque chose

La question décrit le même problème trouve ici - MSDN Forum du Développeur. La question n'est pas acceptée réponse, ni aucune des réponses ne peut être appliqué à mon cas (d'où une autre question).

Question est également à l'origine d'un je demandé précédemment, mais, en raison de la nature différente et plus de problème spécifique, je suis en demander un nouveau.

Code complet peut être trouvé ici: http://pastebin.com/uhBGWC5e
* La seule chose qui a changé est l'achèvement de la tâche de vérification (while -> Task.WhenAll).


Lors de l'attente d'une opération asynchrone à l'intérieur d'une Tâche, la Tâche modifications de statut de RanToCompletion même si, la Tâche est encore en cours d'exécution.

Maintenant, nous allons voir la configuration:

//Start async.
Task t1 = Task.Factory.StartNew(Accept, s1);
Task t2 = Task.Factory.StartNew(Accept, s1);

Task.WhenAll(t1, t2).Wait();

La Accept méthode:

public static async void Accept(object state)
{
    TcpListenerEx server = (TcpListenerEx) state;

    IPEndPoint endPoint = server.LocalEndpoint as IPEndPoint;

    Log("Accepting clients on {0}", endPoint);

    while (true)
    {
        var client = server.AcceptTcpClientAsync();

        if (client == null)
        {
            Log("Null error on accept");
            break;
        }

        TcpClient connected = (TcpClient) client;
        servers[server].Add(connected);

        bool stop = await Task<Task<bool>>.Factory.StartNew(Listen, connected).Unwrap();

        if (stop == true)
        {
            break;
        }
    }

    //Stop the server.
    server.Stop();

    Log("Stoppped {0}", endPoint);
}

En raison de TaskStatus changer de RanToCompletion, le Task.WhenAll().Wait() appel marque elle-même fini assez rapidement, de sorte que le programme sera exécuté par la suite, finalement terminée.

Mais, le Accept tâche, en théorie, ne devrait jamais s'arrêter, elle est à l'écoute pour les connexions jusqu'explicitement arrêté.

Quel est le problème, ici, à l'origine de la Tâche à être marqué comme RanToCompletion prématurément?

Faut-il avoir quelque chose à faire avec vous à l'aide de Task.Factory.StartNew d'invoquer une méthode asynchrone, plutôt que d'avoir de la méthode de retour d'un Task?

OriginalL'auteur jolt | 2014-05-29