1

別のスレッドでウィンドウの背景を変更したいだけです。2つのプログラムがあります。1つは正しく動作し、もう1つはInvalidOperationExceptionをスローします。

正しいコード:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        Thread t = new Thread(new ParameterizedThreadStart(threadTest));
        t.Start(@"C:\Users\Public\Pictures\Sample Pictures\Chrysanthemum.jpg");
    }

    void threadTest(object obj)
    {
        string path = obj as string;
        this.Dispatcher.Invoke(new Func<object>(() => this.Background = new 
    }
}

エラーコード:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        Thread t = new Thread(new ParameterizedThreadStart(threadTest));
        t.Start(@"C:\Users\Public\Pictures\Sample Pictures\Chrysanthemum.jpg");
    }

    void threadTest(object obj)
    {
        string path = obj as string;
        //this.Dispatcher.Invoke(new Func<object>(() => this.Background = new ImageBrush(new BitmapImage(new Uri(path)))));
        ImageBrush background = new ImageBrush(new BitmapImage(new Uri(path)));
        this.Dispatcher.Invoke(new Func<object>(() => this.Background = background));
    }
}

これらのコードの違いは、エラーコードが子スレッドにImageBrushオブジェクトを作成することです。だから私の質問は次のとおりです:wpfプログラムでは、スレッドは独自のスレッドによって作成されたオブジェクトのみを使用できますか?返信ありがとうございます。

4

3 に答える 3

1

はい、あなたは正しいです。UI スレッドだけが作成したオブジェクトを使用できます。したがって、Dispatcher を使用して、適切なスレッドで UI 操作を「キューに入れる」ことができます。

2 番目の質問に答えると、確かに、オブジェクトを UI スレッドに「渡す」方法があります。(Dispatcher の) BeginInvoke 構造が表示されている場合は、次のとおりです。

public DispatcherOperation BeginInvoke(
    Delegate d,
    params Object[] args
)

args が params オブジェクト配列である場合、params を配置する場所があります。

ここで、何らかのFreezableオブジェクト (たとえば、イメージ、ブラシ、変換、ジオメトリなど) を使用している場合はobject.Freeze();、それを UI スレッドに送信する前に行う必要があります。

于 2012-04-20T16:47:26.060 に答える
0

別のスレッドでオブジェクトを作成する場合、最初にフリーズすると、GUI スレッドで使用できます。Freezable オブジェクトを参照してください。

于 2012-04-20T17:27:52.530 に答える
0

はい、正解です。 だけWPFでなく、一般的には についてWindows programmingです。

独自のスレッドとは異なる別のスレッドから UI オブジェクトを更新することはできません。

これは単純に、メッセージのポンピングと、特に OS の宛先制御への配信を保証する必要があるためです。これは、 を使用した通信に当然有効ですSendMesageが、同様に有効ですPostMessage

于 2012-04-20T16:59:40.467 に答える