Dispatcher.Invoke中的错误

时间:2013-06-17 08:27:27

标签: c# wpf multithreading dispatcher

是的,对不起。 所以,我有一个新的WPF项目,一旦它开始流式传输IP摄像头就会显示出来。 为此,我使用只显示图像的字符串。但是,为了确保它成为视频,我使用线程。因为视频流的字符串不起作用。 要避免不同线程的访问冲突问题,请使用委托。 我发布了委托代码和委托方法:

 public delegate void Del(Image images, string url);

        public void setImage(Image images,string url)
        {
            if (images.Dispatcher.CheckAccess())
            {
                Del ert = new Del(setImage);
                images.Dispatcher.Invoke(ert, new object[] { images, url });
                BitmapImage img = new BitmapImage();
                img.BeginInit();
                img.UriSource = new Uri(url);
                img.EndInit(); // Getting exception here 
                images.Source = img;
            }
            else
            {
                images.Dispatcher.BeginInvoke(new Del(setImage), DispatcherPriority.Normal,
                                                     new object[] { images, url });

            }
        }


        public void StreamImg()
        {
            while (true)
            {
                var date = DateTime.Today.Hour;
                setImage(image1, @"http://ipaddress/jpg/image.jpg" + "?" + date);
                Thread.Sleep(10);
             }
        }

但是我的错误在于:

images.Dispatcher.Invoke(ert, new object[] { images, url });

错误是

An unhandled exception of type 'System.StackOverflowException' in WindowsBase.dll

我希望我更清楚,我很抱歉,但我是论坛的新手

1 个答案:

答案 0 :(得分:2)

您的代码以递归方式自行调用自身,从而导致堆栈溢出。

调用setImage方法......

images.Dispatcher.CheckAccess方法返回true或false。

如果为true,则调用调度程序再次调用setImage。

如果为false,则开始调用调度程序再次调用setImage。

整个过程重复,并且永远不会从调用返回,因为它只是在堆栈溢出之前一直调用setImage越来越深。

将dispatcher.invoke从CheckAccess返回true的区域中取出可能会解决您的问题。