public void Dequeue_ShouldBeFIFO_WhenMultipleQueriesAdded_ManyItems() { var queryQueue = new QueryQueue(); var query1 = new TestQuery(1, QueryFunctionType.SingleQuote); var query2 = new TestQuery(2, QueryFunctionType.IntraDay); var query3 = new TestQuery(3, QueryFunctionType.Weekly); var query4 = new TestQuery(4, QueryFunctionType.Monthly); queryQueue.Enqueue(query1); queryQueue.Enqueue(query2); queryQueue.Enqueue(query3); queryQueue.Enqueue(query4); var queries = queryQueue.Dequeue(3).ToList(); Assert.Equal(query1, queries[0]); Assert.Equal(query2, queries[1]); Assert.Equal(query3, queries[2]); Assert.Equal(1, queryQueue.Count); }
/// <summary> /// Does query in background. /// </summary> /// <param name="state">The state.</param> /// <exception cref="NotImplementedException"></exception> private void DoQueryInBackground(object state) { do { if (!Monitor.TryEnter(this)) { return; } try { this.cache.Clear(); this.view.Clear(); var maxThreads = Settings.Default.MaxThreads > 0 ? Settings.Default.MaxThreads : Environment.ProcessorCount; var queue = new QueryQueue(this.GetType().Name, maxThreads); var dates = Enumerable.Range(7, 30).Select(i => DateTime.Now.Date.AddDays(i)).ToList(); this.view.ShowProgress("Report Earning Calendar", "Querying..."); this.view.ShowProgress(0, dates.Count); queue.Start(this.QueryCalendar, dates); this.view.ShowProgress("Report Earning Calendar", $"Retrieved earning reports between [{dates.First().ToShortDateString()} - {dates.Last().ToShortDateString()}]"); } catch (Exception ex) { var error = $"Failed to get calendar from {this.db.GetType().Name}: {ex}"; this.view.Notify(error); } finally { Monitor.Exit(this); } this.cache.Clear(); Thread.Sleep(Convert.ToInt32(TimeSpan.FromHours(1).TotalMilliseconds)); } while (true); }
public MainWindowViewModel() { var dispatcher = Dispatcher.CurrentDispatcher; ProductManager.OnStockClear += () => { ProductSet.Clear(); _productNames.Clear(); }; ProductManager.OnProductAdd += product => { if (_productNames.ContainsKey(product.Name)) { _productNames[product.Name].Number += product.Number; } else { ProductSet.Add(product); _productNames.Add(product.Name, product); } }; ProductManager.OnQueryAdd += query => { dispatcher.Invoke(() => QueryQueue.Enqueue(query)); }; ProductManager.OnQuerySent += () => { dispatcher.Invoke(() => QueryQueue.Dequeue()); }; ProductManager.OnQueryDbFail += msg => { MessageBox.Show(msg, "The Failed Query"); }; ProductManager.StartWork(); }
public async Task GetCurrentIntervalQueriesRanCount_ShouldResetOnNextInterval() { var queryQueue = new QueryQueue(); queryQueue.SetIntervalKey(() => DateTime.UtcNow.Millisecond); var query1 = new TestQuery(1, QueryFunctionType.SingleQuote); var query2 = new TestQuery(2, QueryFunctionType.IntraDay); var query3 = new TestQuery(3, QueryFunctionType.Weekly); queryQueue.Enqueue(query1); queryQueue.Enqueue(query2); queryQueue.Enqueue(query3); queryQueue.Dequeue(2); queryQueue.MarkAsExecuted(query1); queryQueue.MarkAsExecuted(query2); Assert.Equal(2, queryQueue.GetCurrentIntervalQueriesRanCount()); await Task.Delay(10); Assert.Equal(0, queryQueue.GetCurrentIntervalQueriesRanCount()); }
public QueryEventBusTests() { _querySubscriptions = new QuerySubscriptions(); _queryQueue = new QueryQueue(); // Will allow same queries to be queued again after a millisecond _queryQueue.SetIntervalKey(() => DateTime.UtcNow.Millisecond); _mockContextFactory = new Mock <IQueryContextFactory>(); var priorityRule = new QuerySubscriptionCountRule( contextFactory: _mockContextFactory.Object, _querySubscriptions, (new Mock <ILogger <QuerySubscriptionCountRule> >()).Object ); _queryEventBus = new QueryEventBus( queryQueue: _queryQueue, queryContextFactory: _mockContextFactory.Object, queuePriorityRule: priorityRule, logger: (new Mock <ILogger <QueryEventBus> >()).Object ); }
public void IsEmpty_ShouldReturnTrue_WhenNoQueriesAdded() { var queryQueue = new QueryQueue(); Assert.True(queryQueue.IsEmpty()); }