15

我读过这篇文章

在某些应用程序中,您可能希望在连接丢失并且尝试重新连接超时后自动重新建立连接。为此,您可以从 Closed 事件处理程序(JavaScript 客户端上的断开连接事件处理程序)调用 Start 方法。您可能希望在调用 Start 之前等待一段时间,以避免在服务器或物理连接不可用时过于频繁地执行此操作。以下代码示例适用于使用生成的代理的 JavaScript 客户端。

当我从 Closed 事件中调用 Start 方法时

connection.Closed += connection_Closed;
static void connection_Closed()
    {
        Console.WriteLine("connection closed");
        ServerConnection.Start().Wait();
    }

发生异常:连接尚未建立。

我希望它继续运行,直到服务器正常时成功。不要抛出异常。我如何达到这一点。

有任何想法吗?

谢谢

4

3 回答 3

11

与凤凰回答的不同之处:

  • OnDisconnected实际上不需要显式调用,因为Closed事件是在连接失败时触发的
  • 重试前的小延迟
  • 每次都重新创建 ConnectionHub - 根据我的经验,这似乎是必要的(旧的应该由 GC 处理)

代码:

private HubConnection _hubConnection = null;
private IHubProxy _chatHubProxy = null;

private void InitializeConnection()
{
    if (_hubConnection != null)
    {
        // Clean up previous connection
        _hubConnection.Closed -= OnDisconnected;
    }

    _hubConnection = new HubConnection("your-url");
    _hubConnection.Closed += OnDisconnected;
    _chatHubProxy = _hubConnection.CreateHubProxy("YourHub");

    ConnectWithRetry();
}

void OnDisconnected()
{
    // Small delay before retrying connection
    Thread.Sleep(5000);

    // Need to recreate connection
    InitializeConnection();
}

private void ConnectWithRetry()
{
    // If this fails, the 'Closed' event (OnDisconnected) is fired
    var t = _hubConnection.Start();

    t.ContinueWith(task =>
    {
        if (!task.IsFaulted)
        {
            // Connected => re-subscribe to groups etc.
            ...
        }
    }).Wait();
}
于 2016-05-19T20:39:03.903 回答
10

在 .net 客户端上,您可以从关闭的事件处理程序调用 start 方法。如果服务器不可用,您应该进行递归调用。

例如

_connection.Closed += OnDisconnected;
static void OnDisconnected()
{
    Console.WriteLine("connection closed");
    var t=_connection.Start()

    bool result =false;
    t.ContinueWith(task=>
    {
       if(!task.IsFaulted)
       {
           result = true;
       }
    }).Wait();

    if(!result)
    {
         OnDisconnected();
    }
}
于 2014-10-11T00:54:02.133 回答
6

我刚刚在http://www.asp.net/signalr/overview/signalr-20/hubs-api/handling-connection-lifetime-events找到了答案

“如何不断地重新连接

在某些应用程序中,您可能希望在连接丢失并且尝试重新连接超时后自动重新建立连接。为此,您可以从 Closed 事件处理程序(JavaScript 客户端上的断开连接事件处理程序)调用 Start 方法。您可能希望在调用 Start 之前等待一段时间,以避免在服务器或物理连接不可用时过于频繁地执行此操作。以下代码示例适用于使用生成的代理的 JavaScript 客户端。

$.connection.hub.disconnected(function() {
   setTimeout(function() {
       $.connection.hub.start();
   }, 5000); // Restart connection after 5 seconds.
});

在移动客户端中需要注意的一个潜在问题是,在服务器或物理连接不可用时不断尝试重新连接可能会导致不必要的电池消耗。”

于 2013-12-19T17:33:57.280 回答