5

特定のユーザーがまだ接続しているかどうかを確認する必要があります。

ユーザーを追跡する次の HashSet があります。

public static class UserHandler
{
    public static HashSet<string> ConnectedIds = new HashSet<string>();
}

切断されたので:

    public override Task OnDisconnected()
    {
        UserHandler.ConnectedIds.Remove(this.Context.ConnectionId);
        if (UserHandler.ConnectedIds.Count == 0)
        {
               // STOP TASK -> SET CANCELLATION
        }
        return base.OnDisconnected();
    }

および接続時:

    public override Task OnConnected()
    {
        Logger.Log.file.Info("[TaskActionStatus HUB => OnConnected] Start");

        UserHandler.ConnectedIds.Add(this.Context.ConnectionId);

        // start task only if at least one listener
        if (UserHandler.ConnectedIds.Count < 2)
        {
            // START A TASK -> (WHILE LOOP THAT GETS DATA FROM DB EVERY 2 SEC)
        }

        return base.OnConnected();
    }

ここで、ユーザーが単にブラウザ ウィンドウを閉じるだけで問題が発生します。彼/彼女が切断されたかどうかを知る方法はありません。

ここでの質問に基づいて、各クライアントに電話して応答を得ます。どうすればいいのかわからない。

私はこれを持っていると思います:

public static void CheckConnectedUsers()
{
    var context = GlobalHost.ConnectionManager.GetHubContext<TaskActionStatus>();
    foreach (var connection in UserHandler.ConnectedIds)
    {
        context.Clients.Client(connection).verifyConnected("online?");
    }
}

しかし、クライアントから応答を返すにはどうすればよいですか?

編集: 実行される手順:

少なくとも 1 人のユーザーが接続されている場合、タスクを開始する必要があるため、接続しているユーザーの正確な数が必要です。そして、2 人未満のすべての接続ユーザーに対して 1 つのタスクのみが実行されるようにしたい (タスクを開始する)。次のような状況を想定してください: 2 人のユーザーが signalR を使用しているページを表示します。HashSet には 2 つの ID が含まれ、タスクが実行されています。1 人はブラウザを閉じ、数秒後に別のブラウザを更新します。さて、最初のもの(ブラウザを閉じたものはOnDisconnectedメソッドを実行しなかったため、HashSetにはまだConnectionIdがあり、「リフレッシュ」したものはOnDisonneckedを実行し、次にOnConnectedを実行してconnectionIdをHashSetに追加しました。代わりにHashSet に ConnectionId が 1 つしかなく、タスクを開始すると、HashSet には 2 つ (古いもの - もう接続されていないものと、ブラウザを更新したばかりのもの) が含まれます。

ありがとう

4

2 に答える 2

0

私はちょうどこの同じ状況に出くわしました。onDisconnect は常に発生するとは限りません。私の解決策は、ユーザーがまだ接続されているかどうかを確認するために時々ユーザーをポーリングすることでした。

Public Sub checkconnections()
    For Each s In users
        Clients.User(s).areYouThere()
    Next
    users = New List(Of String)
    System.Threading.Thread.Sleep(5000)
    checkconnections()
End Sub
Public Sub imHere()
    Dim id = GetClientId()
    If Not users.Contains(id) Then
        users.Add(id)
    End If
    Clients.All.sendCount(count)
End Sub

そのため、ハブは 5 秒ごとにユーザー リスト内のすべてのクライアントに送信し、リストをクリアします。

クライアントが「areYouThere」メッセージを受信すると、「imHere」で応答し、リストに追加されます。

お役に立てれば。

于 2015-05-04T21:11:17.783 に答える