2

ここに私のハブがあります:

[HubName("marketWatch")]
public class MarketWatchHub : Hub
{
    public override Task OnConnected()
    {
        SocketCommunicator.Instance.UserConnected(Context.ConnectionId, Context.User.Identity.Name);

        return base.OnConnected();
    }

    public override Task OnDisconnected()
    {
        SocketCommunicator.Instance.UserDisconnected(Context.ConnectionId);

        return base.OnDisconnected();
    }

    public override Task OnReconnected()
    {
        // TODO: implement...
        return base.OnReconnected();
    }

    public List<MarketDataResponse> GetAllMarketWatchData()
    {
        return SocketCommunicator.Instance.MarketDataList;
    }
}

そして、これが SocketCommunicator クラスの簡略化されたバージョンです:

public class SocketCommunicator
{
    private static SocketCommunicator _Instance = new SocketCommunicator();

    public static SocketCommunicator Instance
    {
        get { return SocketCommunicator._Instance; }
    }

    private Socket socket { get; set; }

    private readonly object lockObj = new object();

    private IHubContext hubContext;

    private List<UserDetail> connectedUsers;

    public List<MarketDataResponse> MarketDataList;

    private SocketCommunicator() { }

    public void UserConnected(string connectionId, string username)
    {
        lock (lockObj)
        {
            connectedUsers.Add(new UserDetail() { ConnectionId = connectionId, UserName = username });
        }
    }

    public void UserDisconnected(string connectionId)
    {
        lock (lockObj)
        {
            connectedUsers.RemoveAll(ud => ud.ConnectionId == connectionId);
        }
    }

    public void GetMarketData()
    {
        // Do something and set this.MarketDataList
    }        
}

F5 キーを押してアプリケーションをデバッグすると、魅力的に機能します。ユーザーがログインすると、ハブの OnConnected メソッドが呼び出され、ユーザーがログオフすると OnDisconnected メソッドが呼び出されます。ただし、ユーザーがログインしてブラウザを閉じると、OnDisconnected メソッドは呼び出されません。これは、実際には接続されていない膨大な数の UserDetail オブジェクトが、そのうち、connectedUsers リストに含まれることになることを意味します。どうすればこの状況を回避できますか? ユーザーと接続 ID の関連付けを保存するより良い方法はありますか?

前もって感謝します、

4

1 に答える 1