假设我在某个远程服务器上运行了两个服务。当我订阅这些服务时,他们会每秒/分钟开始发送 x 数量的邮件。
现在,假设我有MVC网站,它使用SignalR。
$(function () {
var continiousTaskHub = $.connection.continiousTaskHub;
continiousTaskHub.client.updateData = function (data) {
// Do something with data
};
$.connection.hub.start().done(function () {
$("#start").on('click', function () {
continiousTaskHub.server.continiousTask();
});
});
});
当用户点击开始按钮时,我想开始不断地从这两个命名服务接收和发送回客户端数据。
我目前的设计有效,但我担心这种方法非常糟糕。
public void ContiniousTask()
{
// some logic here
foreach (var item in someCollection)
{
Task.Factory.StartNew(async () =>
{
while (true)
{
// some logic here
this.Clients.Caller.updateData(data);
}
}, null);
}
}
我所做的是为每个调用此集线器方法并开始发送数据的客户端创建后台任务。这是一个无限循环。
忽略这种糟糕的设计,当用户更改网页时,还有(并纠正我,如果我错了)这个功能/任务将继续运行的问题 - 所以至少,我必须找到一种方法添加某种取消令牌。
我现在想到的一个解决方案是尝试/捕获 this.Clients.Caller.updateData 部分以检查客户端是否仍然期望新数据(如果客户端已更改网站/视图,数据不能被发送,所以它被中止。
任何提示都将不胜感激。