特定のユーザーがまだ接続しているかどうかを確認する必要があります。
ユーザーを追跡する次の 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 つ (古いもの - もう接続されていないものと、ブラウザを更新したばかりのもの) が含まれます。
ありがとう