Доступ к элементам управления пользовательского интерфейса из другого потока в WPF
Привет, я снимаю изображение с помощью веб-камеры. в зависимости от используемого устройства(ноутбука) захват изображения либо зависает в какой-то момент, либо нет. Чего я хочу добиться, так это убедиться, что захват не замерзнет.
Вот функция, которая захватывает изображение. он использует библиотеку прямого показа
private void captureImage() { // Release any previous buffer if (m_ip != IntPtr.Zero) { Marshal.FreeCoTaskMem(m_ip); m_ip = IntPtr.Zero; } // capture image m_ip = cam.Click(); b = new Bitmap(cam.Width, cam.Height, cam.Stride, System.Drawing.Imaging.PixelFormat.Format24bppRgb, m_ip); // If the image is upsidedown b.RotateFlip(RotateFlipType.RotateNoneFlipY); System.Windows.Controls.Image win = UIHelper.FindChild<System.Windows.Controls.Image>(System.Windows.Application.Current.MainWindow, "photo"); win.Source = BitmapToImageSource(b); cam.Dispose(); this.DialogResult = true; this.Close(); }
Что я уже пробовал:
я пытаюсь реализовать асинхронную операцию в обработчике событий Тика таймера диспетчера
void timer_Tick(object sender, EventArgs e) { i = --i; count.Content = i; if (i == 2) { prog.IsActive = true; new Task(captureImage).Start(); } if (i == 0) { timer.Stop(); } }
когда я делаю это, я получаю эту ошибку "вызывающий поток не может получить доступ к этому объекту, потому что им владеет другой поток" в этой строке "
System.Windows.Controls.Image win = UIHelper.FindChild<System.Windows.Controls.Image>(System.Windows.Application.Current.MainWindow, "photo");"в функции захвата
но когда я использую диспетчера.Вызвать такой
this.Dispatcher.Invoke((Action)(() => { captureImage(); }));
кадр все еще зависает, есть идеи, как это исправить?