2014-11-04 75 views
0

我想創建一個新的系統,以發送實時交易執行消息給使用SignalR的用戶。在舊系統中,每個客戶端使用Java Applet TCP連接連接到交易服務器。使用SignalR發送實時通知

我用下面的教程作爲參考 http://www.asp.net/signalr/overview/getting-started/tutorial-server-broadcast-with-signalr

有代碼在StockTicker構造線更新股票價格:

_timer = new Timer(UpdateStockPrices, null, _updateInterval, _updateInterval); 

不過,我需要實時更新交易執行而不是每250毫秒更新一次股票價格。 可以在構造函數中爲每個客戶端的交易服務器創建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) 
    { 
     ... 
    } 
} 

回答

1

如果你要在你的集線器構造一個新的TradingManager,而不是引用單,您將爲每個SignalR連接創建多個TradingManager。每個方法調用重新實例化集線器。每次調用集線器方法或集線器事件時(例如OnConnected,OnReconnected,OnDisconnected),您的構造函數都會被調用。

但是,每個SignalR連接僅調用一次OnConnected。順便說一下,SignalR連接與TCP連接完全正交。例如,使用長輪詢傳輸時,每次收到消息時都會發送一個新的HTTP請求。

我想你想每次調用OnConnected時創建一個新的TradingManager實例,並且可能將它與客戶端的Context.ConnectionId相關聯並將其存儲(可能位於ConcurrentDictionary中),以便您可以使用連接ID在Hub方法調用。然後,您可以取消引用OnDisconnected中給定連接ID的存儲的TradingManager實例。

您可以瞭解在更多SignalR連接:

http://www.asp.net/signalr/overview/guide-to-the-api/handling-connection-lifetime-events

您可以瞭解更多有關集線器API,而開*方法在:

http://www.asp.net/signalr/overview/guide-to-the-api/hubs-api-guide-server#connectionlifetime