از یک CancellationToken برای سرآیندها و بدنه .NET HttpClient استفاده کنید
CancellationToken درخواست را هم در آمادهسازی پاسخ HttpClient و هم در خواندن بدنه منتقل کنید، نه اینکه فقط انتظار فراخواننده را اندازه بگیرید.
کرنومتر میتواند انتظار را متوقف کند در حالی که درخواست HTTP ادامه دارد. وقتی تلاش از طریق پروکسی بودجهای در نظر دارد، لغو را به خود عملیات بدهید.
برای یک برنامه مدرن .NET با HttpClient پیکربندیشده برای پروکسی موجود:
using var budget = new CancellationTokenSource(TimeSpan.FromSeconds(5));
using var response = await client.GetAsync(
targetUrl,
HttpCompletionOption.ResponseHeadersRead,
budget.Token);
response.EnsureSuccessStatusCode();
string body = await response.Content.ReadAsStringAsync(budget.Token);
همان بودجه پیش از آمادهسازی آغاز میشود و در حین خواندن بدنه فعال میماند. ResponseHeadersRead کنترل را پس از سرآیندها برمیگرداند، بنابراین مهلت تکمیل خود HttpClient بهتنهایی بودجه بعدی خواندن بدنه را تعیین نمیکند.
لغو را از وضعیت HTTP و خطاهای انتقال جدا نگه دارید. OperationCanceledException میتواند از توکن دادهشده یا مهلت دیگری که پیکربندی شده باشد بیاید؛ منبع لغو مربوطه را بررسی کنید نه اینکه هر شکست را پروکسی مرده گزارش کنید.
کلاینتی را که صاحب این مسیر پروکسی است دوباره استفاده کنید. لغو یک تلاش لازم نیست به معنای بازسازی کل استخر اتصال برای هر درخواست بعدی باشد.
مثال بدنه پاسخ محدود را بافر میکند. دانلود جریانی باید توکن را از حلقه کپی جریان عبور دهد و پاسخ را در هر مسیر خروج آزاد کند.
لغو بیانگر یک سیاست عملیاتی است، نه وعده دقیق زمان واقعی برای هر اقدام زیربنایی سکو. از جایگزین کردن آن با حلقه نظرسنجی بیپایان روی Task.IsCompleted بپرهیزید.