0

对于一个测试示例,我有一个集线器公共方法,它有一个很长的运行循环。

public class testhub : Hub
{
  public void looptest()
  {
    while(true){ <do something>  }
  }

  public void chatmsg()
  {......}
}

客户端 A 连接集线器并调用它 --> testhub.server.looptest
客户端 B 连接集线器并调用它 --> testhub.server.looptest

作为服务器管理员,我如何监视主机集线器中的所有线程,并杀死任何我想要的,而不关闭整个 IIS 或自主机集线器?
例如,假设我构建了一个这样的 UI:

任务运行时间动作
---------- ------------ ------
looptest 5h33min (button kill)
looptest 0h12min (button kill)
chatmsg 1sec (button kill)

4

1 回答 1

0

您当然可以使用IHubPipelineModule跟踪活动集线器方法执行的自定义来构建一些指标报告,以便您拥有所需的可见性,但就“杀死”任何东西而言,没有任何支持。这意味着您会想要杀死在任何正在运行的程序(.NET 或其他程序)中具有不确定副作用的线程,并且您永远无法确定您没有让程序处于糟糕的整体状态。

如果您真的需要这个并且想要走一条高度自定义 SignalR 框架的道路,您可能会做的一件事是注入一个自定义集线器方法调用实现,该实现可能了解如何将CancellationToken参数传递到支持它的方法签名中,以便那些方法可以遵循逻辑取消请求,但即使这样也可以选择加入,这意味着实现实际上必须在其循环逻辑中包含ThrowIfCancellationRequested()对某处的调用(或优雅检查)。IsCancellationRequested

于 2013-06-21T16:14:43.157 回答