Он отлично работает, когда есть одна или две задачи, однако выдает ошибку «Задача была отменена», когда у нас в списке более одной задачи.
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
Картикеян Виджаякумар
источник
источник
CancellationToken
качестве параметра и не используете его?HttpClient
по ошибке, напримерasync Task<HttpResponseMessage> Method(){ using(var client = new HttpClient()) return client.GetAsync(request); }
HttpClient
как @JobaDiniz (сusing()
), пожалуйста, остановитесь! Причина: aspnetmonsters.com/2016/08/2016-08-27-httpclientwrongОтветы:
Есть 2 вероятные причины, по
TaskCanceledException
которым будет брошено:Cancel()
наCancellationTokenSource
связанное с отменой маркера , прежде чем завершения задачи.HttpClient.Timeout
.Я думаю, это был тайм-аут. (Если бы это была явная отмена, вы, вероятно, поняли бы это.) Вы можете быть более уверенным, изучив исключение:
источник
httpClient.Timeout = TimeSpan.FromMinutes(30)
TimeSpan.FromMilliseconds(Configuration.HttpTimeout)
в отличие отnew TimeSpan(Configuration.HttpTimeout)
полученного удовольствия. Спасибо!httpClient.Timeout = TimeSpan.FromMinutes(30)
не очень хороший подход, потому что он блокирует этот конкретный поток на 30 минут, а также не достигнет конечной точки HTTP (что является вашей главной задачей). Кроме того, если ваша программа заканчивается до 30 минут, то вы, скорее всего, столкнетесьThreadAbortException
. Лучшим подходом было бы выяснить, почему эта конечная точка HTTP не поражена, для этого может потребоваться VPN или некоторый ограниченный доступ к сети.await
ed, то ни один поток не заблокирован. Не поток пользовательского интерфейса, не поток потоков другого фонового потока, ни один.Я столкнулся с этой проблемой, потому что мой
Main()
метод не ожидал завершения задачи перед возвратом, поэтомуTask<HttpResponseMessage> myTask
он отменялся при выходе из моей консольной программы.Решение было позвонить
myTask.GetAwaiter().GetResult()
вMain()
(из этого ответа ).источник
Другая возможность заключается в том, что результат не ожидается на стороне клиента. Это может произойти, если какой-либо один метод в стеке вызовов не использует ключевое слово await для ожидания завершения вызова.
источник
Вышесказанное - лучший подход для ожидания большого запроса. Вы запутались около 30 минут; это случайное время, и вы можете дать любое время, которое вы хотите.
Другими словами, запрос не будет ждать 30 минут, если он получит результаты до 30 минут. 30 минут означает, что время обработки запроса составляет 30 минут. Когда произошла ошибка «Задача была отменена», или возникли большие требования к данным.
источник
Другая причина может заключаться в том, что если вы запускаете службу (API) и ставите точку останова в службе (а ваш код застревает на некоторой точке останова (например, решение Visual Studio показывает отладку вместо запуска )). а затем нажав API из клиентского кода. Таким образом, если служебный код приостановлен на некоторой точке останова, вы просто нажимаете F5 в VS.
источник
В моей ситуации метод контроллера не был выполнен как асинхронный, а метод, вызываемый внутри метода контроллера, был асинхронным.
Поэтому я думаю, что важно использовать async / await вплоть до верхнего уровня, чтобы избежать подобных проблем.
источник