Asp.net 使用信号器发送实时通知

Asp.net 使用信号器发送实时通知,asp.net,tcp,signalr,Asp.net,Tcp,Signalr,我想创建一个新系统,使用SignalR向用户发送实时交易执行消息。在旧系统中,每个客户端都使用Java小程序TCP连接连接到交易服务器 我使用以下教程作为参考 StockTicker构造函数中有一行代码用于更新股票价格: _timer = new Timer(UpdateStockPrices, null, _updateInterval, _updateInterval); 但是,我需要实时更新交易执行,而不是每250ms更新一次股票价格。 在构造函数中为每个客户端创建到我的交易服务器的T

我想创建一个新系统,使用SignalR向用户发送实时交易执行消息。在旧系统中,每个客户端都使用Java小程序TCP连接连接到交易服务器

我使用以下教程作为参考

StockTicker构造函数中有一行代码用于更新股票价格:

_timer = new Timer(UpdateStockPrices, null, _updateInterval, _updateInterval);
但是,我需要实时更新交易执行,而不是每250ms更新一次股票价格。 在构造函数中为每个客户端创建到我的交易服务器的TCP连接可以吗?在示例代码中,StockTicker的构造函数(即我的TradingManager)似乎只调用一次。但在我的设计中,我想为每个客户端创建一个TCP连接。我应该如何更改代码来执行此操作

这是我的密码:

TradingHub.cs

public class TradingHub : Hub
{
    private readonly TradingManager _tradingManager;
    public TradingHub() : this(TradingManager.Instance) { }

    public TradingHub(TradingManager tradingManager)
    {
        _tradingManager = tradingManager;
    }
    ...
}
TradingManager.cs

public class TradingManager
{
    // Singleton instance
    private readonly static Lazy<TradingManager> _instance = new Lazy<TradingManager>(
        () => new TradingManager());

    ...

    public static TradingManager Instance{  get{ return _instance.Value; } }

    public TradingManager()
    {
        ...
        this.apiConnector.MessageReceived += new CustomEventHandler(this.api_MessageReceived);
        init();
    }

    private IHubConnectionContext<dynamic> Clients { get; set; }

    private void init()
    {
        TradingSession tradingSession = getLoginSession(user);

        // connect to trading server using TCP connection
        this.apiConnector.ensureConnected(host, port, tradingSession);

        // send keep alive message to trading server periodically
        _timer = new Timer(sendKeepAlive, null, _updateInterval, _updateInterval);
    }

    private void api_MessageReceived(object sender, CustomEventArgs e)
    {
        // when web server receives trade execution from server, send out the message immediately
        Clients.Caller.SendTradeExecutionMessage(......);
    }

    public static TradingSession getLoginSession(string user)
    {
        ...
    }

    private void sendKeepAlive(object state)
    {
        ...
    }
}
公共类TradingManager
{
//单例实例
private readonly static Lazy _instance=new Lazy(
()=>新交易经理());
...
公共静态TradingManager实例{get{return{U Instance.Value;}}
公共交易经理()
{
...
this.apiConnector.MessageReceived+=新的CustomEventHandler(this.api\u MessageReceived);
init();
}
专用IHubConnectionContext客户端{get;set;}
私有void init()
{
TradingSession TradingSession=getLoginSession(用户);
//使用TCP连接连接到交易服务器
此.apiConnector.conferenced已重新连接(主机、端口、tradingSession);
//定期向交易服务器发送保持活动消息
_计时器=新计时器(sendKeepAlive、null、\u updateInterval、\u updateInterval);
}
收到私有void api_message(对象发送方、CustomEventArgs e)
{
//当web服务器接收到来自服务器的交易执行时,立即发送消息
Clients.Caller.SendTradeExecutionMessage(……);
}
公共静态TradingSession getLoginSession(字符串用户)
{
...
}
私有void sendKeepAlive(对象状态)
{
...
}
}

如果要在集线器构造函数中创建一个新的TradingManager,而不是引用一个单例,那么每个信号器连接将创建多个TradingManager。每个方法调用都会重新实例化集线器。每次调用集线器方法或调用集线器事件(例如OnConnectiond、OnReconnected、OnDisconnected)时,都会调用构造函数

但是,每个信号器连接只调用一次OnConnected。顺便说一下,信号器连接与TCP连接完全正交。例如,对于长轮询传输,每次接收到消息时都会发送一个新的HTTP请求

我认为您希望在每次调用OnConnection时创建一个新的TradingManager实例,并可能将其与客户端的
Context.ConnectionId
相关联,并将其存储(可能在ConcurrentDictionary中),以便在调用Hub方法时使用连接id检索它。然后,您可以在OnDisconnected中取消对给定连接id的存储TradingManager实例的引用

有关信号机连接的更多信息,请访问:

有关Hub API和On*方法的更多信息,请访问: