如何设置 Connection.Closed 事件以使其在 SignalR 中重新连接?

How to set Connection.Closed Event to make it reconnect in SignalR?

我想在 disconnected 事件上设置一个计时器以自动尝试重新连接。

var querystringData = new Dictionary<string, string>();
querystringData.Add("uid", Uid);
var connection = new HubConnection(HubUri, querystringData);
_hub = connection.CreateHubProxy(HubName);
connection.Start(new LongPollingTransport()).Wait();
connection.Closed += ???; //how to set this event to try to reconnect?

我只知道如何在 Javascript 中使用 disconnected 回调进行设置:

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

但是如何在 C# (WinForms) 中使用连接的 Closed 事件来做同样的事情?

请把它当作代码,我无法真正测试它,它可能无法编译,但它应该让你知道应该采取的方向,你应该可以修复潜在缺陷:

using System.Windows.Forms;

//...your stuff about query string...
_hub = connection.CreateHubProxy(HubName);

//quick helper to avoid repeating the connection starting code
var connect = new Action(() => 
{
    connection.Start(new LongPollingTransport()).Wait();
});

Timer t = new Timer();
t.Interval = 5000;
t.Tick += (s, e) =>
{
    t.Stop();
    connect();
}

connection.Closed += (s, e) => 
{
    t.Start(); 
}

connect();

这实际上是一个与计时器相关的问题,而不是 SignalR 问题,在这方面,您可以找到 several answered questions 关于 Timer 的内容(有不止一种类型)应该可以帮助您理解这段代码,调整细节并解决线程问题等细微差别