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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 09:32:24