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.
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:
Cancel()
in der CancellationTokenSource
, die dem Abbruch-Token zugeordnet ist, bevor die Aufgabe abgeschlossen ist.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.
}
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.
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.
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.