InvalidOperationExceptionオブジェクトからのスレッドの作
-
22-07-2019 - |
質問
にコンポーネントのラインナップ願っBackgroundWorkerスレッドをオブジェクトです。ましょう話のオブジェクトfoo.
背景に労働者コード
SomeClass foo = new SomeClass();
// Do some operation on foo
// Set some dependency property on the main class to foo
this.Dispatcher.BeginInvoke(DispatcherPriority.Normal,
(SendOrPostCallback)delegate { SetValue(FooProperty, foo); },
foo);
現在のクラスにアクセスしようとしFooProperty用ゲッターを取得しますInvalidOperationException:ッドは、呼び出し側スレッドがアクセスできないこのオブジェクトが別のスレッドが所有します。
場合、スレッドの作成のオブジェクトが完了したら、なぜか自分のオブジェクト?あば頃ます。?
解決
特定のスレッドで作成したオブジェクトは、そのスレッドが所有しています。そのため、InvalidOperationExceptionが発生します。バックグラウンドスレッドでプロパティを設定する場合は、デリゲートに目的の値を返させ、メインスレッドからSetValueを呼び出すことをお勧めします。 (オブジェクトを作成したスレッド)。
他のヒント
その大半はオブジェクトのコンポーネントのラインナップしてスレッドの親和性をることは一度作成した特定のスレッドは、コンポーネントのラインナップオブジェクトに何も入力しないままにして操作を利用する。この制限が施行され、これにはサポート)を実質的にすべての操作だそのオブジェクトです。
を変更する必要がありますコードしていFoo作成された実際のUIのスレッドがこのシナリオ。
SomeClass
が DispatcherObject
から派生していると仮定すると、それを作成したスレッドは foo
オブジェクトのメッセージの処理を担当するメッセージポンプを実行します。したがって、そのスレッドが終了すると、オブジェクトはメッセージを処理できなくなります。これは良い考えではありません。
ほとんどの場合、同じUIスレッドを使用してすべてのUIオブジェクト(または DispatcherObject
から派生したもの)を作成し、アプリケーションの実行中に実行されるようにします。 Dispatcher
を使用して、ワーカースレッドからメッセージを送信します。