Ini berfungsi dengan baik ketika memiliki satu atau dua tugas namun melontarkan kesalahan "Tugas dibatalkan" ketika kami memiliki lebih dari satu tugas yang terdaftar.
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
sumber
sumber
CancellationToken
parameter sebagai dan tidak menggunakannya?HttpClient
karena kesalahan, misalnyaasync Task<HttpResponseMessage> Method(){ using(var client = new HttpClient()) return client.GetAsync(request); }
HttpClient
@JobaDiniz (dengan ausing()
), silakan berhenti! Alasannya: aspnetmonsters.com/2016/08/2016-08-27-httpclientwrongJawaban:
Ada 2 kemungkinan alasan yang
TaskCanceledException
akan dilemparkan:Cancel()
padaCancellationTokenSource
terkait dengan pembatalan tanda sebelum tugas selesai.HttpClient.Timeout
.Dugaan saya adalah batas waktu. (Jika itu adalah pembatalan eksplisit, Anda mungkin akan mengetahuinya.) Anda dapat lebih yakin dengan memeriksa pengecualian:
sumber
httpClient.Timeout = TimeSpan.FromMinutes(30)
TimeSpan.FromMilliseconds(Configuration.HttpTimeout)
sebagai lawannew TimeSpan(Configuration.HttpTimeout)
bekerja memperlakukan. Terima kasih!httpClient.Timeout = TimeSpan.FromMinutes(30)
bukan pendekatan yang baik, karena akan memblokir utas tertentu selama 30 menit dan juga tidak akan mencapai titik akhir HTTP (yang merupakan tugas utama Anda). Juga, jika program Anda selesai sebelum 30 menit maka kemungkinan besar Anda akan bertemuThreadAbortException
. Pendekatan yang lebih baik adalah mencari tahu mengapa titik akhir HTTP itu tidak terkena, mungkin memerlukan VPN atau akses jaringan terbatas.await
, maka tidak ada utas yang diblokir. Bukan utas UI, bukan utas threadpool utas latar belakang lainnya, tidak ada.Saya mengalami masalah ini karena
Main()
metode saya tidak menunggu tugas selesai sebelum kembali, jadiTask<HttpResponseMessage> myTask
dibatalkan ketika program konsol saya keluar.Solusinya adalah untuk memanggil
myTask.GetAwaiter().GetResult()
diMain()
(dari jawaban ini ).sumber
Kemungkinan lain adalah bahwa hasilnya tidak ditunggu di sisi klien. Ini dapat terjadi jika salah satu metode pada tumpukan panggilan tidak menggunakan kata kunci tunggu untuk menunggu panggilan selesai.
sumber
Di atas adalah pendekatan terbaik untuk menunggu permintaan besar. Anda bingung sekitar 30 menit; ini waktu acak dan Anda dapat memberikan waktu yang Anda inginkan.
Dengan kata lain, permintaan tidak akan menunggu selama 30 menit jika mereka mendapatkan hasil sebelum 30 menit. 30 mnt berarti waktu pemrosesan permintaan adalah 30 mnt. Ketika kami terjadi kesalahan "Tugas dibatalkan", atau persyaratan permintaan data besar.
sumber
Alasan lain bisa jadi adalah jika Anda menjalankan layanan (API) dan meletakkan breakpoint di layanan (dan kode Anda macet di beberapa breakpoint (misalnya solusi Visual Studio menunjukkan Debugging alih-alih Menjalankan )). dan kemudian memukul API dari kode klien. Jadi, jika kode layanan berhenti pada beberapa breakpoint, Anda cukup menekan F5 di VS.
sumber
Dalam situasi saya, metode pengontrol tidak dibuat sebagai async dan metode yang disebut di dalam metode pengontrol adalah async.
Jadi saya kira sangat penting untuk menggunakan async / menunggu sampai ke tingkat atas untuk menghindari masalah seperti ini.
sumber