6 Stimmen

Aufgabenstatus Warten auf Aktivierung

Ich habe die folgende Funktion :

async public Task checkNetwork (RestClient _client, ConnectivityManager conn)
    {
        var connected = false;
        var activeConn = conn.ActiveNetworkInfo;
        if (activeConn != null && activeConn.IsConnected) {
            var request = new RestRequest ();
            request.Timeout = 5000;
            var response = await _client.ExecuteAwait (request);
            //Task tmpResponse = _client.ExecuteAsync (request);
            if (response.ErrorException != null)
                connected = false;
            else
                connected = true;
        }

        return connected;
    }

Es hängt immer noch, weil der Status nie WaitingForActivation verlässt, wenn ich es aufrufe. Irgendwelche Ideen?

15voto

Stephen Cleary Punkte 402664

Es bleibt hängen, weil der Status nie WaitingForActivation verlässt, wenn ich ihn aufrufe.

Eigentlich ist WaitingForActivation nur ein Hinweis darauf, dass die Aufgabe noch nicht abgeschlossen ist. Es ist nicht die Ursache des Hängens, sondern ein Indikator dafür. Promise-Aufgaben (einschließlich Aufgaben, die von async-Methoden zurückgegeben werden) bleiben im Zustand WaitingForActivation, bis sie abgeschlossen sind; Ich beschreibe die Aufgabenstatusmaschine im Detail auf meinem Blog.

Die wahrscheinlichste Ursache für eine Blockierung ist das Aufrufen von Task.Result oder Task.Wait weiter oben im Stapel. Ich beschreibe diese Blockierung ausführlich auf meinem Blog, aber im Wesentlichen erfasst await einen "aktuellen Kontext" und verwendet diesen, um seine async-Methode fortzusetzen. Wenn dies vom UI-Thread aus aufgerufen wird, ist dieser Kontext der UI-Thread, und wenn der UI-Thread durch Aufruf von Result/Wait blockiert ist, kann die async-Methode nicht auf diesem UI-Thread fortgesetzt werden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X