Polly TimeoutAsync未触发onTimeoutAsync问题求助
问题原因及解决办法
核心问题在于异步超时策略(
TimeoutAsync)无法感知同步阻塞操作
Polly的TimeoutAsync(异步悲观超时)基于异步协作机制工作,依赖被执行的异步代码主动响应取消信号或进行异步等待。但你在ExecuteAsync的委托里使用了Thread.Sleep(10000)——这是一个同步阻塞调用,会直接卡住当前线程,完全不会与Polly的异步超时逻辑交互,因此不会触发超时回调。同步超时策略(
Timeout)能正常工作的原因
同步版本的Timeout采用线程中断(Thread.Interrupt)的方式终止阻塞的同步操作,所以可以检测到Thread.Sleep导致的超时,进而触发回调。
修复方案
将同步阻塞的Thread.Sleep替换为异步等待的await Task.Delay(10000),让异步超时策略能正确感知并触发超时:
var timeout = Policy.TimeoutAsync(5, TimeoutStrategy.Pessimistic, (c, ts, t) => { _logger.LogInformation("TEST"); return Task.CompletedTask; // 异步回调需返回Task }); await timeout.ExecuteAsync(async () => { await Task.Delay(10000); // 替换为异步等待 });
注意:异步超时的回调委托需要返回Task,显式返回Task.CompletedTask能符合异步方法的规范要求。
内容的提问来源于stack exchange,提问作者KwarcPL
相关产品推荐
相关产品推荐

