2016-04-29 16 views
1

我想监视ASP.NET MVC5应用程序的CPU性能,并且用户可以选择他们想要监视的PC。 我使用SignalR监视实时CPU性能。 它对于第一个CPU来说效果很好,问题是一旦用户选择了另一台受监控的PC,将会创建另一个新的任务this link,以便前一个任务和新任务都将其数据发送到客户端图表。每次调用Signalr Hub类时都继续运行一个任务

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

我真的很感激任何帮助。

这里是我的代码被称为每当用户选择的任何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); 

    } 
+0

您还没有包括你参考.. – stuartd

+0

感谢链接,我固定它。 – Alex

回答

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. 使用的setInterval()在你javascript打电话给你的枢纽,并每隔几秒钟获取值。不要启动任何任务,只需返回值。这样,当客户端断开连接或更改PC时,您不必中止任何正在运行的任务。从工作

  2. 服务器播出不与连接的客户端组的

    • 跟踪(使用JoinGroup()LeaveGroup()
    • 枢纽创建在后台作业中,对于每个组(PC),获取值并将它们广播到连接的客户端

相关链接:

相关问题