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



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

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

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

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

任务运行时操作
---------- ------------ ------
Looptest 5h33min (button kill)
Looptest 0h12min (button kill)
Chatmsg 1sec (button kill)

您当然可以使用跟踪活动中心方法执行的自定义IHubPipelineModule构建一些指标报告,以便您有您正在寻找的可见性,但是就"杀死"任何东西而言,没有支持。这意味着你可能想要杀死一个线程,它在任何正在运行的程序中都有无法确定的副作用。. NET或其他),并且您永远无法确定您没有使程序处于糟糕的整体状态。

如果你真的需要这个,并且想要高度定制SignalR框架,你可以做的一件事是注入一个自定义的hub方法调用实现,它可能知道如何将CancellationToken参数传递到支持它的方法签名中,以便这些方法可以坚持逻辑取消请求。但即使这将是可选的,这意味着实现实际上必须在其循环逻辑的某个地方包括对ThrowIfCancellationRequested()的调用(或IsCancellationRequested的优雅检查)。

最新更新