2013-07-03 51 views
11

我已阅读this postSignalR .NET客户端:如何重新建立

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

当我打电话从Closed事件

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

异常发生的Start方法: 连接尚未建立。

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

有什么想法?

感谢

回答

8

.NET客户端上,可以拨叫关闭事件处理程序启动方法。 如果服务器不可用时,你应该做一个递归调用。

_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(); 
    } 
} 
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. 
}); 

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

+0

我已阅读此文;我想我应该在发起关闭事件时将变量的值设置为false。当变量为true时,我可以使用“Invoke”方法。 – phoenix

+0

如果不使用Javascript的“setInterval”方法,您可以使用连接的状态而不是全局变量 – Nestor

+0

?否则,重新连接只尝试一次。 – willem

4

个差异凤凰的回答是:

  • 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(); 
} 
+0

一个简单的问题。为什么我们有'ConnectWithRetry()'一个单独的函数?我们可以在'InitializeConnection()'本身内嵌它吗?还是我忽略了一些非常明显的东西? – skjoshi

+1

只是可读性我猜(http://programmers.stackexchange.com/q/195989) – Dunc