1

次のコードに問題があります

namespace MyApp
{    
    public partial class PhotoWindow : Window
    {
        private Capture _capture;

        public PhotoWindow ()
        {
            InitializeComponent();    
            _capture = new Capture();

            if (_capture != null)
            {
                //<Image> in XAML
                CaptureSource.Width = 150;
                CaptureSource.Height = 180;

                _capture.ImageGrabbed += ProcessFrame;
                _capture.Start();                
            }

            Activated += (s, e) => _capture.Start();
            Closing += (s, e) =>
            {
                if (_capture == null) return;
                _capture.Stop();                
                _capture.Dispose();
            };
        }

        private void ProcessFrame(object sender, EventArgs e)
        {
            try
            {
                Image<Bgr, Byte> frame = _capture.RetrieveBgrFrame();                   
                CaptureSource.Source = Helper.ToBitmapSource(frame);
            }
            catch (Exception exception)
            {

                System.Windows.MessageBox.Show(exception.ToString());
            }
        }

    }
}

アプリケーションを実行すると、System.InvalidOperationException: The thread that this call can not access this object because the owner is another threadオンラインで例外が発生しますCaptureSource.Source = Helper.ToBitmapSource(frame);

私はこれを解決できるので?

4

2 に答える 2

1

ImageGrabbed イベントは Capture のバックグラウンド スレッドから発生しているようです。そのため、ハンドラはウィンドウの UI スレッドではなくそのスレッドで実行されています。

Dispatcher を使用して、コントロールの UI スレッドでコードを呼び出すことができます。

CaptureSource.Dispatcher.Invoke(() =>
{
   Image<Bgr, Byte> frame = _capture.RetrieveBgrFrame();                   
   CaptureSource.Source = Helper.ToBitmapSource(frame);
});
于 2013-01-26T16:17:23.313 に答える