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

使用System.Reactive为同步Read方法添加超时的正确实现方式

同步方法添加超时机制的正确实现

你的代码崩溃是因为Rx的Timeout操作符在超时后会抛出TimeoutException,而Wait()会直接把这个异常抛出来,一旦没被捕获就会导致程序崩溃。下面是两种靠谱的实现方式:

方式一:用Rx并捕获超时异常

如果坚持用Rx,给Wait()加上异常捕获即可:

public int Method()
{
    try
    {
        return Observable.Start(() => Read())
                         .Timeout(TimeSpan.FromSeconds(2))
                         .Wait();
    }
    catch (TimeoutException)
    {
        // 这里写超时后的处理逻辑,比如返回默认值或者抛出自定义异常
        return -1; // 根据业务需求调整返回值
    }
}

方式二:用Task实现(更轻量)

如果不需要Rx的其他功能,用Task的方式更简单直观,还不用引入Rx依赖:

public int Method()
{
    var readTask = Task.Run(() => Read());
    // 等待指定时间,返回任务是否完成
    if (readTask.Wait(TimeSpan.FromSeconds(2)))
    {
        return readTask.Result;
    }
    else
    {
        // 超时处理:要么抛异常,要么返回默认值
        throw new TimeoutException("Read操作超时");
        // return -1; 也可以选择返回默认值
    }
}

补充说明

原来的代码崩溃核心原因是:Timeout触发后会发送OnError信号,Wait()会将这个信号转为TimeoutException抛出,而你没有任何异常捕获逻辑,导致未处理异常终止程序。

内容的提问来源于stack exchange,提问作者SuperJMN

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 22:45:59