每次调用Signalr Hub类时都继续运行一个任务

时间:2016-04-29 07:34:43

标签: asp.net-mvc multithreading signalr task

我想在我的ASP.NET MVC5应用程序上监视CPU性能,用户可以选择他们想要监视的PC。 我使用SignalR来监控实时CPU性能。 它适用于第一个CPU,问题是一旦用户选择另一台要监控的PC,将创建另一个根据this link的新任务,以便前任和新任务都将其数据发送到客户端图表。

处理我的问题的解决方案是什么,以便一旦用户更换PC,相应的PC数据将发送到客户端聊天,或者我需要更改我的代码,以便只有第一个当前任务可以继续发送数据。 / p>

我真的很感激任何帮助。

以下是我每次用户选择任何PC时调用的代码:

public class MonitorHub : Hub
{
    CancellationTokenSource wtoken;
    public MonitorHub()
    {
        wtoken = new CancellationTokenSource();
    }

    public void StartCounterCollection(string pcName)
    {
        var unitOfWork = new CMS.Data.UnitOfWork();
        var task = Task.Factory.StartNew(async () =>
        {

            var perfService = new PerfCounterService();
            // await FooAsync(perfService, ref pcName);
            while (true)
            {

                var result = perfService.GetResult(pcName);
                Clients.All.newCounter(result);
                await Task.Delay(2000, wtoken.Token);

            }
        }
        , wtoken.Token);

    }

1 个答案:

答案 0 :(得分:2)

您需要使用群组和服务器广播。

客户端:当PC更改时,保留现有PC组“pcName1”并加入选定的PC组“pcName2”。

服务器:首先,尝试使用Working with Groups in SignalR来实施这些组。之后,使用Server Broadcast从服务器广播到每个组:

var clients = GlobalHost.ConnectionManager.GetHubContext<MonitorHub>().Clients;
clients.Group("pcName1").updateValues(values)

稍后编辑

Tasks use background threads from the thread pool. Canceling threads using the Abort method is not recommended.

为了使用SignalR每隔几秒更新一次图表,您有两种选择:

  1. javascript 中使用 SetInterval()来呼叫集线器并每隔几秒钟获取一次值。不要启动任何任务,只需返回值。这样,当客户端断开连接或更改PC时,您不必中止任何正在运行的任务。

  2. 来自中心未创建的作业的服务器广播

    • 跟踪已连接客户端的群组(使用 JoinGroup() LeaveGroup()
    • 在后台作业中,为每个组(PC)获取值并将其广播到连接的客户端
  3. 有用的链接: