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 (ボタン キル)
looptest 0h12min (ボタン キル) chatmsg 1sec
(ボタン キル)

4

1 に答える 1

0

確かに、アクティブなハブ メソッドの実行を追跡するカスタムを使用して、いくつかのメトリック レポートを組み込むことができるIHubPipelineModuleので、探している可視性を得ることができますが、何かを "kill" する限り、それはサポートされていません。これは、実行中のプログラム (.NET など) で不確定な副作用を持つスレッドを強制終了したいということであり、プログラムを全体的に悪い状態のままにしていないことを確認することはできません。

これが本当に必要で、SignalR フレームワークを高度にカスタマイズする道をたどりたい場合におそらくできることの 1 つは、CancellationTokenそれをサポートするメソッド シグネチャにパラメーターを渡す方法を理解できるカスタム ハブ メソッド呼び出しの実装を挿入することです。メソッドは論理的なキャンセル要求に従うことができますが、それはオプトインであり、実装は実際にはループ ロジック内のどこかにへの呼び出しThrowIfCancellationRequested()(または の適切なチェック) を含める必要があることを意味します。IsCancellationRequested

于 2013-06-21T16:14:43.157 に答える