You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 09:54:51