public async void StartBackgroundJob(object sender, DoWorkEventArgs e) { while (!_backgroundWorker.CancellationPending) { IVideoFrame frame = await QueryFrameAsync(); if (frame != null) { _currentFrame = frame; IVideoFrame filteredFrame = frame.Clone(); if (_videoFilters != null) { foreach (IVideoFilter filter in _videoFilters) { filter.Filter(filteredFrame); } } _currentFilteredFrame = filteredFrame; _currentFrameTag = _frameTagCounter++; int progress = (int)(256 * frame.Timestamp / _videoProperties.Duration); if (progress != _progress) { _progress = progress; PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Progress))); } if (frame.Timestamp != _position) { _position = frame.Timestamp; PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Position))); } } } }