Działa dobrze, gdy ma jedno lub dwa zadania, ale zgłasza błąd „Zadanie zostało anulowane”, gdy mamy na liście więcej niż jedno zadanie.
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();
}
c#
task-parallel-library
dotnet-httpclient
Karthikeyan Vijayakumar
źródło
źródło
CancellationToken
jako parametr i nie używasz go?HttpClient
, np.async Task<HttpResponseMessage> Method(){ using(var client = new HttpClient()) return client.GetAsync(request); }
HttpClient
jak @JobaDiniz (z ausing()
), przestań! Powód: aspnetmonsters.com/2016/08/2016-08-27-httpclientwrongOdpowiedzi:
Istnieją 2 prawdopodobne powody, dla
TaskCanceledException
których zostanie rzucony:Cancel()
naCancellationTokenSource
związane z odwołaniem tokena przed zadanie zakończone.HttpClient.Timeout
.Domyślam się, że upłynął limit czasu. (Gdyby było to wyraźne anulowanie, prawdopodobnie zorientowałbyś się.) Możesz być bardziej pewien, sprawdzając wyjątek:
źródło
httpClient.Timeout = TimeSpan.FromMinutes(30)
TimeSpan.FromMilliseconds(Configuration.HttpTimeout)
zamiastnew TimeSpan(Configuration.HttpTimeout)
pracy. Dzięki!httpClient.Timeout = TimeSpan.FromMinutes(30)
nie jest dobrym podejściem, ponieważ zablokuje ten konkretny wątek na 30 minut, a także nie trafi do punktu końcowego HTTP (co jest twoim głównym zadaniem). Ponadto, jeśli Twój program zakończy się przed 30 minutami, najprawdopodobniej napotkaszThreadAbortException
. Lepszym rozwiązaniem byłoby ustalenie, dlaczego ten punkt końcowy HTTP nie został trafiony, może wymagać VPN lub jakiegoś ograniczonego dostępu do sieci.await
, żaden wątek nie jest blokowany. Nie wątek interfejsu użytkownika, nie wątek puli wątków inny wątek tła, brak.Natknąłem się na ten problem, ponieważ moja
Main()
metoda nie czekała na zakończenie zadania przed powrotem, więcTask<HttpResponseMessage> myTask
została anulowana po wyjściu z programu konsoli.Rozwiązaniem było zadzwonić
myTask.GetAwaiter().GetResult()
wMain()
(z tej odpowiedzi ).źródło
Inną możliwością jest to, że wynik nie jest oczekiwany po stronie klienta. Może się to zdarzyć, jeśli jakakolwiek metoda na stosie wywołań nie używa słowa kluczowego czekania do oczekiwania na zakończenie połączenia.
źródło
Powyższe jest najlepszym podejściem do oczekiwania na duże zamówienie. Jesteś zdezorientowany około 30 minut; jest to losowy czas i możesz dać dowolny czas, który chcesz.
Innymi słowy, żądanie nie będzie czekać przez 30 minut, jeśli otrzyma wyniki przed 30 minutami. 30 minut oznacza, że czas przetwarzania żądania wynosi 30 minut. Kiedy wystąpił błąd „Zadanie zostało anulowane” lub wymagania dotyczące dużych danych.
źródło
Innym powodem może być to, że jeśli uruchomisz usługę (API) i umieścisz punkt przerwania w usłudze (a kod utknie w pewnym punkcie przerwania (np. Rozwiązanie Visual Studio pokazuje Debugowanie zamiast Uruchamianie )). a następnie kliknięcie interfejsu API z kodu klienta. Więc jeśli kod usługi został wstrzymany w pewnym punkcie przerwania, po prostu nacisnąłeś F5 w VS.
źródło
W mojej sytuacji metoda kontrolera nie została wykonana jako asynchroniczna, a metoda wywołana w metodzie kontrolera była asynchroniczna.
Sądzę więc, że ważne jest używanie asynchronizacji / czekania aż do najwyższego poziomu, aby uniknąć takich problemów.
źródło