如何监视SignalR主机的死锁或长时间运行的线程?

时间:2013-06-21 03:14:00

标签: signalr

对于一个测试示例,我有一个hub公共方法,它有一个长时间运行的循环。

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

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

客户端A连接集线器并将其调用 - &gt; testhub.server.looptest
客户端B连接集线器并调用它 - &gt; testhub.server.looptest

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

任务运行时间动作
---------- ------------ ------
looptest 5h33min(按钮杀死)
looptest 0h12min(按钮杀死)
chatmsg 1秒(按钮杀死)

1 个答案:

答案 0 :(得分:0)

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

如果你确实需要这个并且希望通过高度自定义SignalR框架的道路,你可以做的一件事就是注入一个自定义的hub方法调用实现,该实现可能理解如何将CancellationToken参数传递到支持它的方法签名,以便这些方法可以遵循逻辑取消请求,但即使这样也会选择加入,这意味着实现实际上必须包括对ThrowIfCancellationRequested()的调用(或对{{3的优雅检查)在其循环逻辑中的某个地方。