尝试重新连接后协程未在 Unity WebSocket 客户端中启动

问题描述 投票:0回答:1

我正在开发一个使用

WebSocketSharp
处理网络连接的 Unity 项目。我的脚本应该在连接丢失或出现错误时重新连接到服务器。我正在使用协程来延迟重新连接尝试。但是,协程似乎没有启动,并且我没有看到来自
ReconnectCoroutine()
的预期日志。

这是我的代码的简化版本:

using System.Collections;
using UnityEngine;
using WebSocketSharp;

public class WebSocketClient : MonoBehaviour
{
    private WebSocket ws;
    public Configurations config;
    private int reconnectAttempt = 0;

    void Start()
    {
        ConnectToServer();
    }

    void ConnectToServer()
    {
        ws = new WebSocket(config.serverAddress);
        ws.OnOpen += (sender, e) => Debug.Log("Connected.");
        ws.OnError += (sender, e) => AttemptReconnect();
        ws.OnClose += (sender, e) => AttemptReconnect();
        ws.Connect();
    }

    void AttemptReconnect()
    {
        if (reconnectAttempt < config.maxReconnectAttempts)
        {
            reconnectAttempt++;
            Debug.Log($"Reconnect attempt {reconnectAttempt}/{config.maxReconnectAttempts}");
            StartCoroutine(ReconnectCoroutine());
        }
        else
        {
            Debug.LogError("Max reconnect attempts reached.");
        }
    }

    private IEnumerator ReconnectCoroutine()
    {
        Debug.Log("Starting ReconnectCoroutine");
        yield return new WaitForSeconds(config.reconnectDelay);
        Debug.Log("Reconnect Delay passed");
        ConnectToServer();
    }

    void OnDestroy()
    {
        ws?.Close();
    }
}

在此设置中:

ConnectToServer()
Start()
上调用并尝试连接到 WebSocket 服务器。 如果出现错误或连接关闭,则会调用
AttemptReconnect()
。 这应该记录一次尝试并启动一个协程来延迟下一次连接尝试。 问题是,当调用
AttemptReconnect()
时,我看到重新连接尝试的日志,但协程 (
ReconnectCoroutine()
) 没有启动,因此在延迟后不会再次调用
ConnectToServer()
方法。

此脚本附加到的游戏对象存在且处于活动状态,并且脚本已启用。

有人以前遇到过这个问题或者可以发现这里可能出了什么问题吗?任何帮助将不胜感激!

c# unity-game-engine websocket coroutine
1个回答
0
投票

WebsocketSharp 事件在后台线程上发送,协程是 Monobehavior 的一部分,需要在主线程上运行。

您可以使用主线程调度程序来解决此问题,这里是另一个问题的链接,其中有一个示例:c# unity IEnumerator notworking in eventhandler

© www.soinside.com 2019 - 2024. All rights reserved.