如何设置 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
的内容(有不止一种类型)应该可以帮助您理解这段代码,调整细节并解决线程问题等细微差别
我想在 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
的内容(有不止一种类型)应该可以帮助您理解这段代码,调整细节并解决线程问题等细微差别