CCXT Pro中WatchOrders WebSocket在Core类中无法触发的问题求助
问题排查与修复方案
结合你的场景,核心问题出在WatchOrders这类异步订阅方法的生命周期处理上:这类WebSocket订阅本质是持续的异步数据流,只有在持续await它的情况下,才能维持连接、接收后续消息并触发回调。你在while(true)循环里能正常运行,正是因为循环持续await了这个方法;而事件驱动场景下没触发,大概率是以下常见错误:
常见错误及修复
错误1:仅调用
WatchOrders()但未持续await
如果你的Core类里只是单次调用exchange.WatchOrders()却不await,方法执行到内部第一个await点就会返回,订阅流直接中断,自然不会有后续消息触发事件。
修复:在Core类中启动一个后台任务,持续await订阅流并触发事件:// Core类初始化时启动订阅任务 private async Task StartOrderSubscription() { try { // 多数交易所SDK的WatchOrders返回异步迭代器,用await foreach遍历 await foreach (var orderUpdate in exchange.WatchOrders()) { // 触发自定义事件,推送给所有Foo实例 OrderReceived?.Invoke(this, orderUpdate); } } catch (Exception ex) { // 处理网络异常、断开重连等逻辑 // 比如等待几秒后重新调用StartOrderSubscription() } } // 在Core的构造函数或初始化方法中启动任务 public Core() { // 启动后台任务,无需等待(用_丢弃返回值,或持有Task引用) _ = StartOrderSubscription(); }错误2:订阅对象被垃圾回收
如果WatchOrders()返回的订阅实例没有被Core类持有引用,可能被GC回收导致连接中断。确保Core类保留订阅相关的对象引用,或者后台任务持续运行(上面的代码中后台任务会持有订阅流的引用,避免被回收)。错误3:事件注册时机滞后
如果Foo实例是在Core启动订阅之后才注册OrderReceived事件,会错过之前的消息,但你说“完全无法触发”,这个概率较低,可检查事件注册逻辑是否在订阅启动前完成。
额外注意事项
- 不同交易所SDK的
WatchOrders实现可能不同,但核心逻辑一致:必须持续await才能维持数据流。而WatchTicker能正常工作,大概率是SDK内部已经封装了持续维持的逻辑,或者你在调用时无意中处理了await。 - 务必添加异常处理和重连逻辑,否则网络断开后订阅会终止,不再触发事件。
内容的提问来源于stack exchange,提问作者Sixk
相关产品推荐
相关产品推荐

