使用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
相关产品推荐
相关产品推荐

