8

System.Timers.Timerクライアントがアクティブな接続を含むウィンドウ/タブを閉じた後、SignalR ハブで実行されているを停止したいと考えています。

サーバーコードを呼び出してサーバーにブール値を送信して、クライアントがまだ接続されているかどうかをサーバーに通知しようとしましたが、現在は機能していません。

window.onbeforeunload = function () {
    profile.server.setIsConnected(false);
};

サーバ側:

public ProfileHub()
{  
    timer = new Timer(15000);
    timer.Elapsed += (sender, e) => { timer_Elapsed(sender, e, _isActive); };
    timer.AutoReset = false;
}

[Authorize]
private void timer_Elapsed(object sender, ElapsedEventArgs e, bool active)
{            
    timer.Stop();

    if (active)
    {
        System.Diagnostics.Debug.WriteLine("Timer Started");
        timer.Start();
    }
    else
    {
        System.Diagnostics.Debug.WriteLine("Timer Stopped");
        return;
    }
    // process code
}

[Authorize]
public void SetIsActive(bool isActive)
{
    _isActive = isActive;
}

これは可能ですか、私は正しい軌道に乗っていますか? の匿名デリゲートと関係があると思われますが、timer.Elapsed完全にはわかりません。

4

2 に答える 2

16

SignalR には、クライアントがこれらのアクションのいずれかを実行するたびに呼び出される OnConnected、OnDisconnected、および OnReconnected があります。それらを単純にオーバーライドできます。

public override Task OnConnected()
{
    return base.OnConnected();
}

public override Task OnDisconnected()
{
    //custom logic here
    return base.OnDisconnected();
}

public override Task OnReconnected()
{
    return base.OnReconnected();
}

デバッグ目的でも非常に役立つことがわかりました。各人にタイマーを設定したい場合は、上記の関数と一緒にある種の connectionMapping を使用して、ユーザーを追跡する必要があります。

于 2014-04-11T19:57:44.857 に答える
3

OnDisconnectedタイマーの代わりにメソッドを使用する必要があります。公式ドキュメントは次のとおりですが、フレームワークは、接続されたクライアントが切断または再接続したときにイベントを提供します。

于 2014-04-11T19:57:33.540 に答える