public void Open() { _messageQueue.Open(); ThreadingHelper .Thread(() => CultureInfo.InvariantCulture.DoInCulture(() => { while (!_messageQueue.IsClosed) { try { var sended = _historyMessageAdapter.SendOutMessage(); var processed = false; while (_messageQueue.TryDequeue(out var message, true, false)) { NewOutMessage?.Invoke(message); processed = true; } if (!sended && !processed && !_messageQueue.IsClosed) { Thread.Sleep(100); } } catch (Exception ex) { _errorHandler(ex); } } })) .Name("History emulation channel thread.") .Launch(); }
public void Open() { _messageQueue.Open(); ThreadingHelper .Thread(() => CultureInfo.InvariantCulture.DoInCulture(() => { while (!_messageQueue.IsClosed) { try { var sended = _historyMessageAdapter.SendOutMessage(); Message message; if (!_messageQueue.TryDequeue(out message, true, !sended)) { if (!sended) { break; } } else { NewOutMessage?.Invoke(message); } } catch (Exception ex) { _errorHandler(ex); } } })) .Name("History emulation channel thread.") .Launch(); }
private void OnLoad() { try { var messageTypes = new[] { MessageTypes.Time, ExtendedMessageTypes.Clearing }; var token = _cancellationToken.Token; while (!token.IsCancellationRequested) { _syncRoot.WaitSignal(); _messageQueue.Clear(); _messageQueue.Open(); _isInitialized = true; _isChanged = false; _moveNextSyncRoot.PulseSignal(); foreach (var action in _actions.CopyAndClear()) { if (action.Item2) { _basketStorage.InnerStorages.Add(action.Item1); } else { _basketStorage.InnerStorages.Remove(action.Item1); } } var boards = Boards.ToArray(); var loadDate = _currentTime != DateTimeOffset.MinValue ? _currentTime.Date : StartDate; var startTime = _currentTime; while (loadDate.Date <= StopDate.Date && !_isChanged && !token.IsCancellationRequested) { if (boards.Length == 0 || boards.Any(b => b.IsTradeDate(loadDate, true))) { this.AddInfoLog("Loading {0}", loadDate.Date); var messages = _basketStorage.Load(loadDate.UtcDateTime.Date); // storage for the specified date contains only time messages and clearing events var noData = !messages.DataTypes.Except(messageTypes).Any(); if (noData) { EnqueueMessages(loadDate, startTime, token, GetSimpleTimeLine(loadDate)); } else { EnqueueMessages(loadDate, startTime, token, messages); } } loadDate = loadDate.Date.AddDays(1).ApplyTimeZone(loadDate.Offset); } if (!_isChanged) { EnqueueMessage(new LastMessage { LocalTime = StopDate }); } _isInitialized = false; } } catch (Exception ex) { EnqueueMessage(ex.ToErrorMessage()); EnqueueMessage(new LastMessage { IsError = true }); } }