2012-01-05 9 views
0

現在、2つのスレッドが実行されているアプリケーションを作成していますが、しばしばWindow.WindowStyleプロパティを設定する必要がありますが、試行するとエラーが発生します私の呼び出しはスレッドセーフではないので、そうしてください。私はすでにこれを解決するInvokeRequiredメソッドを使用する方法を知っていますが、this.WindowStyle.InvokeRequiredと入力すると、Viusal StudioはInvokeRequiredが有効なプロパティではないと言います。.NET Window.WindowStyleプロパティへのスレッドセーフな呼び出し

どうすればこの問題を解決できますか?

私のアプリケーションは、フォームではなくWPFアプリケーションです。私はVB.NETをよく知らないので、答えはC#の用語であることを好むでしょう。

ありがとうございました!

EDIT:Ok、this.Dispatcher.CheckAccess()は初期の問題を修正したようですが、実際にif文で呼び出すときに同じエラーが発生します。助言がありますか?

+0

Window.InvokeRequiredを使用すべきではありませんか? – malkia

+0

同じ問題が発生する – danielmhanover

答えて

1

をチェックする必要があります。

どこかWPFアプリケーションの起動中に、あなたは同期コンテキストを作成する必要があり、このような何か:

SynchronizationContext SyncContext = new DispatcherSynchronizationContext(); 

このコードは、現在のディスパッチャを使用して、同期コンテキストを作成しますので、あなたは、おそらく中にこれを呼び出しますディスパッチャの起動後、メインウィンドウの初期化。

次はあなたがGUIスレッドにあなたのコードをマーシャリングするSendまたはPostメソッドを使用します。

SyncContext.Send(delegate(object obj) { 
    // set main window style here, for example: 
    MainWindow.WindowStyle = WindowStyle.SingleBorderWindow; 
}, null); 

ありコードプロジェクトでの同期コンテキストに良い記事です:http://www.codeproject.com/KB/threads/SynchronizationContext.aspxが、それはWindowsフォームに固有のものです。

+0

// ...メインウィンドウのスタイルをここに設定します。 – danielmhanover

+0

上記のコード例を変更して、少し考えました。基本的には、実行したいものをメインのGUIスレッドに入れます。あなたの場合は、メインウィンドウでプロパティを設定しています。 –

+0

私はそれを働かせました。ありがとう! – danielmhanover

0

あなたは私はあなたが古いISynchronizeInvokeインターフェースの代わりに、ここでSynchronizationContextを使用する場合は、より多くの成功を持っているだろうと思いif (this.Dispatcher.CheckAccess())

+0

SetTextCallbackとthis.Invokeの代わりに何を使用しますか? – danielmhanover

+0

@ user788532: 'this.Dispatcher.BeginInvoke(新しいアクション(...))' – SLaks

関連する問題