public void InvokeMaxEveryDelayTimeTestWithoutSynchronizationContext() { Assert.IsNull(SynchronizationContext.Current); int actionCallCount = 0; var throttledAction = new ThrottledAction(() => Interlocked.Add(ref actionCallCount, 1), ThrottledActionMode.InvokeMaxEveryDelayTime, TimeSpan.FromMilliseconds(100)); Assert.IsFalse(throttledAction.IsRunning); throttledAction.InvokeAccumulated(); Assert.IsTrue(throttledAction.IsRunning); throttledAction.InvokeAccumulated(); throttledAction.InvokeAccumulated(); // Multiple calls of InvokeAccumulated within the delayTime should call the action just once. Task.Delay(200).Wait(); Assert.AreEqual(1, actionCallCount); Assert.IsFalse(throttledAction.IsRunning); actionCallCount = 0; throttledAction.InvokeAccumulated(); Task.Delay(10).Wait(); throttledAction.InvokeAccumulated(); Task.Delay(150).Wait(); throttledAction.InvokeAccumulated(); // Calls the action twice: First 2 InvokeAccumulated are within delayTime; Last is after delayTime. Task.Delay(200).Wait(); Assert.AreEqual(2, actionCallCount); Assert.IsFalse(throttledAction.IsRunning); actionCallCount = 0; throttledAction.InvokeAccumulated(); Task.Delay(10).Wait(); throttledAction.Cancel(); // Do not call the action because it is cancelled. Task.Delay(200).Wait(); Assert.AreEqual(0, actionCallCount); Assert.IsFalse(throttledAction.IsRunning); // Calling Cancel multiple time most not throw an exception throttledAction.Cancel(); throttledAction.Cancel(); }
private void DocumentServicePropertyChanged(object sender, PropertyChangedEventArgs e) { if (e.PropertyName == nameof(IDocumentService.ActiveDocumentFile)) { updateDiagnosticsAction.Cancel(); startCommand.RaiseCanExecuteChanged(); } }