黎明undefined 2023-12-29 20:22 采纳率: 0%
浏览 6

.NET Polly v8 AddTimeout 方法不生效

为什么请求 TestTimeoutSync 方法后为什么 OnTimeout 方法的输出语句并没有被打印出来?
看起来就像是设置的超时根本没有生效一样,请问如何解决?


[HttpGet]
        [Route("TestTimeoutSync")]
        public string TestTimeoutSync()
        {
            ResiliencePipeline pipeline = new ResiliencePipelineBuilder()
            .AddTimeout(new TimeoutStrategyOptions
            {
                TimeoutGenerator = args =>
                {
                    return new ValueTask<TimeSpan>(TimeSpan.FromSeconds(1));
                },
                OnTimeout = args =>
                {
                    Console.WriteLine($"Execution timed out after {args.Timeout.TotalSeconds} seconds.");
                    return default;
                }
            })
            .Build();

            pipeline.Execute(static () => {
                var res = TheadSleep();
                Console.WriteLine(res);
                return res;
            });
            return "TestTimeoutSync timeout!";
        }

        public static string TheadSleep()
        {
            Thread.Sleep(2000);
            return "This is TheadSleep";
        }
  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-12-29 22:40
    关注

    【以下回答由 GPT 生成】

    在代码中,你使用了.NET Polly v8库来实现超时策略。然而,在执行请求TestTimeoutSync方法后,OnTimeout方法的输出语句并没有被打印出来,看起来设置的超时似乎没有生效。

    针对这个问题,有以下可能的原因和解决方案:

    1. 问题原因:在执行任务之前,超时策略需要在异步上下文中进行配置。

    解决方案:将配置超时策略的代码移动到异步上下文中。

    public async Task<string> TestTimeoutSync()
    {
        ResiliencePipeline pipeline = new ResiliencePipelineBuilder()
            .AddTimeout(new TimeoutStrategyOptions
            {
                TimeoutGenerator = args =>
                {
                    return new ValueTask<TimeSpan>(TimeSpan.FromSeconds(1));
                },
                OnTimeout = args =>
                {
                    Console.WriteLine($"Execution timed out after {args.Timeout.TotalSeconds} seconds.");
                    return default;
                }
            })
            .Build();
    
        await pipeline.ExecuteAsync(async () => {
            var res = await TheadSleepAsync();
            Console.WriteLine(res);
            return res;
        });
    
        return "TestTimeoutSync timeout!";
    }
    
    public static Task<string> TheadSleepAsync()
    {
        return Task.Delay(2000).ContinueWith(_ => "This is TheadSleep");
    }
    
    1. 问题原因:TestTimeoutSync方法中的TheadSleep方法使用了同步的Thread.Sleep,导致线程被阻塞,可能导致超时策略无法生效。

    解决方案:将TheadSleep方法改为异步方法,并使用Task.Delay代替Thread.Sleep

    public static async Task<string> TheadSleepAsync()
    {
        await Task.Delay(2000);
        return "This is TheadSleep";
    }
    

    这样,TestTimeoutSync方法中的代码就可以正常运行,并打印超时提示。

    最后,你可能需要调用异步方法TestTimeoutSync,用await关键字等待其执行完成:

    var result = await TestTimeoutSync();
    

    以上是我对你提供的代码信息的解析和解决方案。希望我的回答能够帮到你。如果有其他问题,请随时提问。


    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 创建了问题 12月29日

悬赏问题

  • ¥15 拟通过pc下指令到安卓系统,如果追求响应速度,尽可能无延迟,是不是用安卓模拟器会优于实体的安卓手机?如果是,可以快多少毫秒?
  • ¥20 神经网络Sequential name=sequential, built=False
  • ¥16 Qphython 用xlrd读取excel报错
  • ¥15 单片机学习顺序问题!!
  • ¥15 ikuai客户端多拨vpn,重启总是有个别重拨不上
  • ¥20 关于#anlogic#sdram#的问题,如何解决?(关键词-performance)
  • ¥15 相敏解调 matlab
  • ¥15 求lingo代码和思路
  • ¥15 公交车和无人机协同运输
  • ¥15 stm32代码移植没反应