L'Appel De TaskCompletionSource.SetResult non bloquant de manière

J'ai découvert que TaskCompletionSource.SetResult(); appelle le code en attente de la tâche avant de la retourner. Dans mon cas, entraîner un blocage.

C'est une version simplifiée qui est démarré dans un ordinaire Thread

void ReceiverRun()
    while (true)
    {
        var msg = ReadNextMessage();
        TaskCompletionSource<Response> task = requests[msg.RequestID];

        if(msg.Error == null)
            task.SetResult(msg);
        else
            task.SetException(new Exception(msg.Error));
    }
}

La "async" partie du code ressemble à ceci.

await SendAwaitResponse("first message");
SendAwaitResponse("second message").Wait();

L'Attente est effectivement imbriquées à l'intérieur des non-appels asynchrones.

La SendAwaitResponse(simplifié)

public static Task<Response> SendAwaitResponse(string msg)
{
    var t = new TaskCompletionSource<Response>();
    requests.Add(GetID(msg), t);
    stream.Write(msg);
    return t.Task;
}

Mon hypothèse était que la deuxième SendAwaitResponse exécuté dans un pool de threads thread, mais elle continue dans le thread créé pour ReceiverRun.

Est-il de toute façon à définir le résultat d'une tâche sans poursuivre son attendu de code?

L'application est un application console.

  • Un très simple solution de contournement serait de faire Task.Run(() => task.SetResult(msg)); (et de la même façon avec SetException()). Mais j'espère qu'il y est une meilleure option.
InformationsquelleAutor hultqvist | 2013-10-20