17

まず、私はWPFとC#に精通していると言う必要があります。アプリケーション:マンデルブロ画像の作成(GUI)この場合、ディスパッチャは完全に機能します。

  private void progressBarRefresh(){

       while ((con.Progress) < 99)
       {
           progressBar1.Dispatcher.Invoke(DispatcherPriority.Send, new Action(delegate
                {
                    progressBar1.Value = con.Progress;
                }
              ));
       }
  }

以下のコードでこれを実行しようとすると、メッセージ(タイトル)が表示されます。

bmp = BitmapSource.Create(width, height, 96, 96, pf, null, rawImage, stride);

this.Dispatcher.Invoke(DispatcherPriority.Send, new Action(delegate
            {                     
                img.Source = bmp;
                ViewBox.Child = img;  //vllt am schluss
            }
          ));

私のプログラムがどのように機能するかを説明しようと思います。ピクセルと色を計算するための新しいスレッドを作成しました(GUIが応答しないため)。このスレッド(メソッド)では、計算の準備ができた後、ディスパッチャーを使用してビューボックスの画像を更新しています。

計算を別のスレッドに入れない場合は、イメージを更新またはビルドできます。

4

5 に答える 5

33

オブジェクトを異なるスレッド間で共有したい場合に備えて、常に UI スレッドでそのオブジェクトを作成してください。後でオブジェクトにアクセスしたいときに、オブジェクトにアクセスできるかどうかを確認できます。アクセスできない場合は、UI スレッド アクセスで関数を再度呼び出します。以下のコード例:

    private void YourMethod()
    {
        if (Application.Current.Dispatcher.CheckAccess())
        {
            // do whatever you want to do with shared object.
        }
        else
        {
            //Other wise re-invoke the method with UI thread access
            Application.Current.Dispatcher.Invoke(new System.Action(() => YourMethod()));
        }
    }
于 2012-12-05T15:14:32.657 に答える
7

MSDN は次のように述べています。「凍結された Freezable はスレッド間で共有できます。」

このスレッドが役立つかもしれません: http://social.msdn.microsoft.com/Forums/en-US/windowswic/thread/9223743a-e9ae-4301-b8a4-96dc2335b686

于 2010-06-05T23:30:45.457 に答える
3

を取得するDispatcherと、異なるスレッドごとに異なるものを取得します。

this.DispatcherUI のものではなく別の Dispatcher を提供している可能性があるため、そのエラーが発生します。

代わりに使用してみてくださいApplication.Current.Dispatcher。これは常に UI スレッドの Dispatcher を返します。

Dispatcher.CurrentDispatcherもちろん、別のスレッドから使​​用すると、同じエラーが発生する可能性があります。

于 2013-01-28T21:11:57.937 に答える
2

キューイングメカニズムを使用して、スレッド間でメッセージを渡すこともできます。結局のところ、それがWindowsアーキテクチャの仕組みです。それがディスパッチャが行っていることです。WPFスレッドが所有していないデリゲートに参照を渡しています。

そうです、基本的な考え方はありますが、実際には、を使用してAction<T>(T object)、またはあなたの場合は、ビットマップを他のスレッドに渡す必要があります。

Dispatcher.Invoke(DispatcherPriority.Send, new Action<Bitmap>(delegate(Bitmap img) {
    do things here...
}), bmp);
于 2010-06-05T23:51:21.583 に答える
2

bmpworker(?) スレッドでビットマップ ( ) を作成し、それを UI スレッドに渡しています。失敗しているのはこれです。

UI スレッドでイメージを作成する必要があります。おそらく、表示したい画像を参照し、その情報を UI に渡す何らかの方法が必要になるでしょう。

于 2010-06-05T23:26:16.460 に答える