0

はい、すみません。だから、IPカメラのストリーミングを開始すると表示される新しいWPFプロジェクトがあります。これを行うには、画像のみを表示する文字列を使用します。ただし、確実に動画になるように、スレッドを使用しています。ビデオ ストリーミングの文字列が機能しないためです。異なるスレッドのアクセスの競合の問題を回避するには、デリゲートを使用します。デリゲートとデリゲート メソッドのコードを投稿します。

 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

申し訳ありませんが、フォーラムは初めてです

4

1 に答える 1

2

あなたのコードは再帰的に自分自身を永遠に呼び出し、スタックオーバーフローを引き起こします。

setImage メソッドが呼び出されます...

images.Dispatcher.CheckAccess メソッドは true または false を返します。

true の場合、ディスパッチャーを呼び出して setImage を再度呼び出します。

false の場合は、ディスパッチャを起動して setImage を再度呼び出します。

そして、プロセス全体が繰り返され、スタックがオーバーフローするまでsetImageをどんどん深く呼び出し続けるため、呼び出しから戻ることはできません。

CheckAccess が true を返す領域から dispatcher.invoke を取り出すと、問題が解決する可能性があります。

于 2013-06-18T21:11:43.287 に答える