public static void CancelStreamRequest() { _cancelingStream = true; if (_quoteStreamRequest != null) { _quoteStreamRequest.CloseStream(); _quoteStreamRequest = null; } }
private static void StartStreamingData(QuoteStreamRequest quoteStream, CancellationToken cancelToken, CancellationTokenSource tokenSource) { Task.Run(() => { Console.WriteLine("Starting data stream, press enter to cancel..."); // Poll on this property if you have to do other cleanup before throwing. if (cancelToken.IsCancellationRequested) { cancelToken.ThrowIfCancellationRequested(); } quoteStream.Execute((items) => { foreach (var item in items) { var ticker = string.Format("[{0}]", item.Symbol); var time = DateTime.Now.ToShortTimeString(); if (item is Quote) { Quote quote = (Quote)item; int askSz = Convert.ToInt32(quote.Asksz); int bidSz = Convert.ToInt32(quote.Bidsz); Console.WriteLine("{0} [Qu] {1} Ask: {2} Bid: {3} AskSz: {4} BidSz: {5}", time, ticker.PadRight(5, ' '), quote.Ask.PadRight(6, ' '), quote.Bid.PadRight(5, ' '), askSz.ToString("N0").PadRight(9, ' '), bidSz.ToString("N0")); using (var db = DbFactory.GetDbSource()) { db.SaveStreamQuote(quote); } } else if (item is Trade) { Trade trade = (Trade)item; Console.WriteLine("{0} [Tr] {1} Last: {2} Vol: {3}", time, ticker.PadRight(6, ' '), trade.Last.PadRight(5, ' '), trade.Vl); using (var db = DbFactory.GetDbSource()) { db.SaveStreamTrade(trade); } } } }); }); }
private static void StreamingData_EntryPoint() { var tokenSource = new CancellationTokenSource(); var ct = tokenSource.Token; List <string> tickers; using (var db = DbFactory.GetDbSource()) { tickers = db.GetTickers(); } var quoteStream = new QuoteStreamRequest(tickers); var task = Task.Factory.StartNew(() => { // Were we already canceled? ct.ThrowIfCancellationRequested(); StartStreamingData(quoteStream, ct, tokenSource); }, tokenSource.Token); try { task.Wait(); var exit = Console.ReadLine(); if (string.IsNullOrWhiteSpace(exit)) { Console.WriteLine("Cancel requested"); tokenSource.Cancel(); } } finally { tokenSource.Dispose(); } quoteStream.CloseStream(); quoteStream = null; }
private void StartStreamingData() { Task.Run(() => { List <string> tickers; using (var db = DbFactory.GetDbSource()) { tickers = db.GetTickers(); } var quoteStream = new QuoteStreamRequest(tickers); Console.WriteLine("Starting data stream"); // Poll on this property if you have to do other cleanup before throwing. quoteStream.Execute((items) => { foreach (var item in items) { var ticker = string.Format("[{0}]", item.Symbol); var time = DateTime.Now.ToShortTimeString(); if (item is Quote) { Quote quote = (Quote)item; int askSz = Convert.ToInt32(quote.Asksz); int bidSz = Convert.ToInt32(quote.Bidsz); Console.WriteLine("{0} [Qu] {1} Ask: {2} Bid: {3} AskSz: {4} BidSz: {5}", time, ticker.PadRight(5, ' '), quote.Ask.PadRight(6, ' '), quote.Bid.PadRight(5, ' '), askSz.ToString("N0").PadRight(9, ' '), bidSz.ToString("N0")); if (quote.Symbol == "SSPXF") { App.Current.Dispatcher.Invoke(delegate { this.SSPXFQuotes.Add(new QuoteDataPoint { Ask = Convert.ToDecimal(quote.Ask), Bid = Convert.ToDecimal(quote.Bid), Time = DateTime.Parse(quote.Datetime) }); }); } else if (quote.Symbol == "CANWF") { App.Current.Dispatcher.Invoke(delegate { this.CANWFQuotes.Add(new QuoteDataPoint { Ask = Convert.ToDecimal(quote.Ask), Bid = Convert.ToDecimal(quote.Bid), Time = DateTime.Parse(quote.Datetime) }); }); } using (var db = DbFactory.GetDbSource()) { db.SaveStreamQuote(quote); } } else if (item is Trade) { Trade trade = (Trade)item; Console.WriteLine("{0} [Tr] {1} Last: {2} Vol: {3}", time, ticker.PadRight(6, ' '), trade.Last.PadRight(5, ' '), trade.Vl); using (var db = DbFactory.GetDbSource()) { db.SaveStreamTrade(trade); } } } }); }); }
//private static CancellationToken _cancelToken; //private static CancellationTokenSource _cancelTokenSource; public static async void ExecuteStreamRequest(List <string> tickers, Action <List <StreamDataItem> > callback) { _quoteStreamRequest = new QuoteStreamRequest(tickers); try { _cancelingStream = false; await _quoteStreamRequest.Execute(callback); } catch (WebException ex) { Console.WriteLine("[Quote Stream] Web exception: " + ex.Message); if (_quoteStreamRequest != null) { _quoteStreamRequest.CloseStream(); } if (!_cancelingStream) { DoRetry(5000, tickers, callback); } } catch (IOException ex) { // TK API closed the connection, cleanup and retry in 1 second Console.WriteLine("[Quote Stream] IO exception: " + ex.Message); if (_quoteStreamRequest != null) { _quoteStreamRequest.CloseStream(); } if (!_cancelingStream) { DoRetry(1000, tickers, callback); } } catch (NullReferenceException ex) { Console.WriteLine("[Quote Stream] NullReferenceException. StackTrace: " + ex.StackTrace); if (_quoteStreamRequest != null) { _quoteStreamRequest.CloseStream(); } if (!_cancelingStream) { DoRetry(1000, tickers, callback); } } catch (Exception ex) { Console.WriteLine(string.Format("[Quote Stream] Unhandled exception: {0} [{1}]", ex.Message, ex.GetType().ToString())); Console.WriteLine(); if (_quoteStreamRequest != null) { _quoteStreamRequest.CloseStream(); } if (!_cancelingStream) { DoRetry(1000, tickers, callback); } } }