public override Task StartConvertingAsyncTask() { return Task.Run(() => { Encoder = new AnimatedGifEncoder(); _mediaDetector = new MediaDetector(); _mediaDetector.LoadMedia(Path); ConvertingProgressBar.Dispatcher.Invoke( DispatcherPriority.Normal, new Action(() => { ConvertingProgressBar.Value = 0; ConvertingProgressBar.Maximum = (To - From) * Fps / 1000; })); Encoder.Start(GifPath); Encoder.SetDelay(Ival); Encoder.SetRepeat(0); for (var i = From; i < To; i += Ival) { var frame = GetFrame(TimeSpan.FromMilliseconds(i)); if (GifSize.Height != -1 && GifSize.Width != -1) frame = ResizeImage(frame); AddFrame(frame); ConvertingProgressBar.Dispatcher.Invoke( DispatcherPriority.Normal, new Action(() => { ConvertingProgressBar.Value++; })); } Encoder.Finish(); }); }
public MediaDetectorElement() { m_frames = new ObservableCollection<VideoFrame>(); Frames = new ReadOnlyObservableCollection<VideoFrame>(m_frames); m_mediaDetector = CreateMediaDetector(); Loaded += MediaDetectorElement_Loaded; }
private static MediaDetector CreateMediaDetector() { MediaDetector detector = null; /* The reset event will block our thread while * we create an intialize the player */ var reset = new ManualResetEvent(false); /* We need to create a new thread for our Dispatcher */ var t = new Thread((ThreadStart) delegate { detector = new MediaDetector(); /* We queue up a method to execute * when the Dispatcher is ran. * This will wake up the calling thread * that has been blocked by the reset event */ detector.Dispatcher.Invoke((Action) (() => reset.Set())); Dispatcher.Run(); }) { Name = "MediaDetector", IsBackground = true }; t.SetApartmentState(ApartmentState.STA); /* Starts the thread and creates the object */ t.Start(); /* We wait until our object is created and * the new Dispatcher is running */ reset.WaitOne(); return detector; }