2012-04-20 7 views
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プログラムでは、スレッドは自分のスレッドによって作成されたオブジェクトを使用することができますか?返信いただきありがとうございます。

答えて

1

はい、あなたは正しいです。 UIスレッドのみが作成したオブジェクトを使用できます。したがって、ディスパッチャを使用して、適切なスレッド上でUI操作を「エンキュー」できます。

2番目の質問に答えるには、オブジェクトをUIスレッドに「渡す」方法があります。あなたは(ディスパッチャの)BeginInvokeメソッド構造が表示された場合、それはです:

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

引数がのparamsオブジェクト配列でどこのparamsを置く場所、あります。

Freezableオブジェクト(たとえば、イメージ、ブラシ、トランスフォームまたはジオメトリ)を使用している場合は、object.Freeze();をUIスレッドに送信する必要があります。

+0

UIスレッドが単独で作成したオブジェクトしか使用できない場合は、ほかのスレッドがオブジェクトをUIスレッドに渡すようにする方法はありますか? – adream307

+0

@ adream307確かに、私の編集を参照してください:) –

0

はい、正しく、約WPFであるだけでなく、一般に約Windows programmingです。

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

なぜなら、メッセージポンピング、特にOSの宛先制御への配信が保証されなければならないからです。これはもちろん、SendMesageを使用して通信する場合は有効ですが、PostMessageの場合も有効です。

0

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

関連する問題