RustRcon库回调异常:UpdateServerInfo重复执行且info为Null求助
RustRcon回调执行两次,UI文本赋值失效且出现Null输出
问题代码
private void Update() { timer += Time.deltaTime; if(timer >= updateTime && connectionChecker.Status) { try { rconManager.Client.SendCommand(new GetServerInfo((info) => { UpdateServerInfo(info); })); } catch(Exception ex) { print(ex.Message); } timer = 0; } } private void UpdateServerInfo(RustRcon.Types.Response.ServerInfo info) { print(info.Hostname); hostName_Text.text = info.Hostname; }
问题现象
仅保留print(info.Hostname);时,服务器返回后UpdateServerInfo()仅执行1次,完全正常。但添加hostName_Text.text = info.Hostname;后,控制台会输出两次信息:第一次是正确的服务器名称,第二次为Null。同时UI文本hostName_Text的赋值完全不生效,执行完两次print后就不再有后续操作。
问题原因与解决方案
核心原因
- Unity线程安全限制:RustRcon的回调是在后台线程执行的,而Unity的UI组件只能在主线程中修改。直接在后台线程操作UI会触发未捕获的线程异常,进而导致RustRcon内部的错误处理机制重复触发回调,甚至中断后续操作。
- 未处理的Null引用:第一次回调触发UI操作抛出异常后,RustRcon可能会以Null参数再次调用回调,导致第二次输出Null。
解决步骤
将UI操作转移到主线程
用队列把UI更新任务缓存起来,在Unity的Update方法(主线程)中执行:private readonly Queue<Action> _mainThreadTasks = new Queue<Action>(); private void Update() { timer += Time.deltaTime; if(timer >= updateTime && connectionChecker.Status) { try { rconManager.Client.SendCommand(new GetServerInfo((info) => { lock(_mainThreadTasks) { _mainThreadTasks.Enqueue(() => UpdateServerInfo(info)); } })); } catch(Exception ex) { print(ex.Message); } timer = 0; } // 处理主线程任务 lock(_mainThreadTasks) { while(_mainThreadTasks.Count > 0) { _mainThreadTasks.Dequeue().Invoke(); } } } private void UpdateServerInfo(RustRcon.Types.Response.ServerInfo info) { if(info == null) { print("服务器信息为空"); return; } print(info.Hostname); hostName_Text.text = info.Hostname; }添加Null参数校验
在UpdateServerInfo开头先判断info是否为Null,避免Null引用异常扩散。检查RustRcon重试机制
查看RustRcon库的配置,确认是否开启了自动重试,如果有可以尝试关闭,避免异常后重复触发回调。
内容的提问来源于stack exchange,提问作者MaltrzD
相关产品推荐
相关产品推荐

