public void Update() { lock (stateLock) { switch (State) { case UpdateFilterState.Idle: State = UpdateFilterState.UpdateRequested; break; case UpdateFilterState.UpdateInProgress: State = UpdateFilterState.UpdateRequestQueued; break; case UpdateFilterState.UpdateRequested: break; case UpdateFilterState.UpdateRequestQueued: break; case UpdateFilterState.Terminate: break; } } }
public UpdateFilter(Action onUpdate, TimeSpan maxFreq) { this.OnUpdate = onUpdate; dispatcher = Dispatcher.CurrentDispatcher; UpdateThread = new Thread(new ThreadStart(doUpdateThread)); UpdateThread.Priority = ThreadPriority.BelowNormal; UpdateThread.IsBackground = true; UpdateThread.Start(); floodGate = new FloodGate(maxFreq); State = UpdateFilterState.Idle; }
protected void doUpdateThread() { while (State != UpdateFilterState.Terminate) { Thread.Sleep(10); Thread.SpinWait(1); switch (State) { case UpdateFilterState.Idle: break; case UpdateFilterState.UpdateInProgress: break; case UpdateFilterState.UpdateRequestQueued: break; case UpdateFilterState.UpdateRequested: lock (stateLock) { State = UpdateFilterState.UpdateInProgress; } Task.Run(() => { try { DispatcherOperation op = dispatcher.InvokeAsync(OnUpdate); op.Wait(); } finally { switch (State) { case UpdateFilterState.UpdateInProgress: State = UpdateFilterState.Idle; break; case UpdateFilterState.UpdateRequestQueued: State = UpdateFilterState.UpdateRequested; break; } } }); break; } } }
public void Dispose() { State = UpdateFilterState.Terminate; }