wake-up-neo.com

HttpClient - Eine Aufgabe wurde abgebrochen?

Es funktioniert einwandfrei, wenn eine oder zwei Aufgaben ausgeführt werden, es wird jedoch der Fehler "Eine Aufgabe wurde abgebrochen" ausgegeben, wenn mehrere Aufgaben aufgelistet sind.

enter image description here

List<Task> allTasks = new List<Task>();
allTasks.Add(....);
allTasks.Add(....);
Task.WaitAll(allTasks.ToArray(), configuration.CancellationToken);


private static Task<T> HttpClientSendAsync<T>(string url, object data, HttpMethod method, string contentType, CancellationToken token)
{
    HttpRequestMessage httpRequestMessage = new HttpRequestMessage(method, url);
    HttpClient httpClient = new HttpClient();
    httpClient.Timeout = new TimeSpan(Constants.TimeOut);

    if (data != null)
    {
        byte[] byteArray = Encoding.ASCII.GetBytes(Helper.ToJSON(data));
        MemoryStream memoryStream = new MemoryStream(byteArray);
        httpRequestMessage.Content = new StringContent(new StreamReader(memoryStream).ReadToEnd(), Encoding.UTF8, contentType);
    }

    return httpClient.SendAsync(httpRequestMessage).ContinueWith(task =>
    {
        var response = task.Result;
        return response.Content.ReadAsStringAsync().ContinueWith(stringTask =>
        {
            var json = stringTask.Result;
            return Helper.FromJSON<T>(json);
        });
    }).Unwrap();
}

Es gibt zwei mögliche Gründe dafür, dass eine TaskCanceledException geworfen wird:

  1. Etwas namens Cancel() in der CancellationTokenSource, die dem Abbruch-Token zugeordnet ist, bevor die Aufgabe abgeschlossen ist.
  2. Die Anforderung ist abgelaufen, d. H. Sie wurde nicht innerhalb der unter HttpClient.Timeout angegebenen Zeitspanne abgeschlossen.

Ich vermute, es war eine Auszeit. (Wenn es sich um eine ausdrückliche Stornierung handelte, hätten Sie das wahrscheinlich herausgefunden.) Sie können sicherer sein, wenn Sie die Ausnahme prüfen:

try
{
    var response = task.Result;
}
catch (TaskCanceledException ex)
{
    // Check ex.CancellationToken.IsCancellationRequested here.
    // If false, it's pretty safe to assume it was a timeout.
}
190
Todd Menier

Dieses Problem ist aufgetreten, da meine Main()-Methode vor dem Zurückkehren nicht auf den Abschluss der Aufgabe gewartet hat. Der Task<HttpResponseMessage> myTask wurde abgebrochen, als mein Konsolenprogramm beendet wurde.

Die Lösung bestand darin, myTask.GetAwaiter().GetResult() in Main() (von dieser Antwort ) aufzurufen.

11
Ben Hutchison

Eine andere Möglichkeit ist, dass das Ergebnis auf der Clientseite nicht erwartet wird. Dies kann passieren, wenn eine der Methoden auf der Aufrufliste nicht mit dem Schlüsselwort await wartet, bis der Aufruf abgeschlossen ist.

8
Manish

Ein weiterer Grund kann sein, dass Sie den Dienst (API) ausführen und einen Haltepunkt in den Dienst einfügen (und Ihr Code an einem Haltepunkt hängen bleibt (zB zeigt die Visual Studio-Lösung Debugging anstelle von Running ) ). und dann die API vom Client-Code aus. Wenn also der Servicecode an einem Haltepunkt angehalten wurde, drücken Sie einfach F5 in VS.

0
vivek nuna