C#如何重复执行异步HTTP GET调用直到按键终止?
异步循环执行HTTP请求直到按键终止的实现方案
你可以通过取消令牌机制实现可控的循环逻辑,不需要复杂的多线程控制,就能做到用户按下任意键时立刻终止请求、退出程序。
核心实现逻辑:
- 用
CancellationTokenSource生成全局取消标记 - 启动独立的后台任务监听控制台按键,检测到输入时触发取消标记
- 主逻辑循环判断取消标记状态,未触发时就执行HTTP请求、输出响应内容
- 所有异步操作(HTTP请求、可选的请求间隔等待)都传入取消令牌,避免程序卡在正在执行的请求上无法退出
修改后的完整可运行代码:
using System; using System.Threading; using System.Threading.Tasks; using System.Net.Http; namespace Hello { class Program { private static readonly HttpClient client = new HttpClient(); static async Task Main(string[] args) { // 初始化取消令牌源 using var cts = new CancellationTokenSource(); // 后台监听按键,按下任意键即触发取消 _ = Task.Run(() => { Console.ReadKey(); cts.Cancel(); }); // 请求头仅需初始化配置一次,无需每次请求重置 client.DefaultRequestHeaders.Accept.Clear(); try { // 循环执行请求,直到收到取消信号 while (!cts.IsCancellationRequested) { // 传入取消令牌,取消信号触发时会自动中断请求 var response = await client.GetStringAsync("https://localhost:8080", cts.Token); Console.Write(response); // 如果需要控制请求频率,比如间隔1秒发一次请求,取消下面行的注释即可 // await Task.Delay(1000, cts.Token); } } catch (OperationCanceledException) { // 捕获取消操作触发的异常,正常提示退出 Console.WriteLine("\n已检测到按键输入,程序停止运行。"); } } } }
几个优化提示:
- 原代码中把请求头清理配置放在单次请求方法里,循环执行时会重复做无意义的操作,提到循环外初始化一次即可
- 如果要保留原来的
ProcessRepositories方法结构,只需要给方法增加CancellationToken类型的入参,把令牌透传给GetStringAsync方法即可 - 不要用
Thread.Sleep之类的同步等待方法控制请求间隔,会阻塞异步线程,用带取消令牌的Task.Delay才是正确写法
内容的提问来源于stack exchange,提问作者Sanchez82
相关产品推荐
相关产品推荐

