用截止时间令牌取消经代理的 .NET HttpClient 请求
当代理的截止时间到期时,取消网络操作本身,而不是只结束调用方的等待。
把截止时间交给能够取消网络工作的操作。对于已有的、经代理配置的 .NET HttpClient:
using var deadline = new CancellationTokenSource(TimeSpan.FromSeconds(20));
using var response = await client.GetAsync(uri, deadline.Token);应用程序提供 client 和 uri。此重载接收取消令牌;围绕等待其任务的超时只会限制该调用方的等待。轮询完成标志也有同样的问题:调用方可以离开,而套接字和工作线程仍被占用。
取消遵循客户端的实现和清理路径。它并不承诺每个底层操作都会在精确的指令处停止。让该路径完成,并释放操作所拥有的资源。在设计中将受单独控制的正文读取纳入考虑;对于现代的 .NET ResponseHeadersRead 操作,通过正文读取传递同一个令牌。其他客户端提供各自的取消、中止和清理接口。
重试需要为上一次尝试给出结果。保留其标识符和选定的代理,在需要时请求取消,并避免在无限启动替代操作时丢失任务。否则,一个缓慢的端点积累工作的速度可能快于应用程序释放的速度。
远端结果需要单独处理。取消发生时,目标可能已经收到了提交。使用应用程序的恢复或幂等策略;停止本地工作并不能撤销远端操作。