Клиент SignalR.Net: как восстановить соединение

Я прочитал этот пост

В некоторых приложениях вы можете автоматически восстановить соединение после его утраты, и попытка повторного подключения завершится. Для этого вы можете вызвать метод Start из обработчика событий Closed (отключенный обработчик событий на JavaScript-клиентах). Вы можете подождать некоторое время, прежде чем позвонить в Start, чтобы избежать слишком часто, когда сервер или физическое соединение недоступны. Следующий пример кода предназначен для клиента JavaScript с использованием сгенерированного прокси.

Когда я вызываю метод Start из закрытого события

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

Произошло исключение:   соединение не установлено.

Я хочу, чтобы он продолжался до тех пор, пока он не будет успешным, когда сервер будет в порядке. Не бросайте исключение. Как мне это достичь.

любые идеи?

спасибо

Ответ 1

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

Ответ 2

Я только что нашел ответ на http://www.asp.net/signalr/overview/signalr-20/hubs-api/handling-connection-lifetime-events

"Как постоянно подключаться

В некоторых приложениях вы можете автоматически восстановить соединение после его утраты, и попытка повторного подключения завершится. Для этого вы можете вызвать метод Start из обработчика событий Closed (отключенный обработчик событий на JavaScript-клиентах). Вы можете подождать некоторое время, прежде чем позвонить в Start, чтобы избежать слишком часто, когда сервер или физическое соединение недоступны. Следующий пример кода предназначен для клиента JavaScript с использованием сгенерированного прокси.

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

Потенциальная проблема, о которой следует знать в мобильных клиентах, заключается в том, что попытки непрерывного повторного соединения, когда сервер или физическое соединение недоступны, могут привести к ненужному отказу батареи. "

Ответ 3

Отличия от ответа на феникс:

  • Явный вызов 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();
}