3

私はこれが他の質問で議論されていることを理解していますが、私はここで私の髪を引っ張っています-明らかに何か明らかなものが欠けています。私はあなたにいくつかの背景情報を提供しようとしますので、ここに行きます...

UIスレッドがフリーズしていたので、UIをインタラクティブに保つために、すべての重い処理を行うバックグラウンドワーカーを作成しました。

いくつかの円弧/パスの座標を生成し、それをキャンバスに描画する必要があります。バックグラウンドワーカーは、PathGeometryを他のデータとともにリストに格納する、作業完了メソッドを処理して実行します。次に、backgroundworkerに渡したオブジェクトを使用して、backgroundworkerからUIスレッドでupdate()メソッドを呼び出しました。

私の問題は、UIスレッドでPathオブジェクトの作成を開始すると(backgroundworkerスレッドで作成できなくなる)、PathGeometriesにアクセスできないことです。私のオブジェクトはCommunicationArcで、PathGeometry、不透明度、色などを保持しています。

The calling thread cannot access this object because a different thread owns it.

オブジェクトの他の部分にはアクセスできますが、PathGeometryにはアクセスでき、その理由はわかりません。workcompleteメソッドが実行され、アークがすべて私のリストに保存されているので、backgroundworkerは確実に終了しています。UIスレッドでアークを読み取り、それらをもう少し処理して、描画を続けたいだけです。

次のように、UIスレッドからディスパッチャーを使用してみました。

arc.pathGeometry.Dispatcher.BeginInvoke((Action)(() =>
            {
                MessageBox.Show(arc.pathGeometry.ToString());
            }));

しかし、私が行っていることが正しいかどうかはよくわかりません。ディスパッチャーを呼び出すさまざまなメソッドは、何もしないか、BeginInvoke()ですべてをロックします。

どんな助けでも素晴らしいでしょう、私はここで輪になって行くような気がします!

4

2 に答える 2

3

UIスレッドで直接ジオメトリオブジェクトを作成および操作する必要があります。実行するスレッド処理は、ジオメトリオブジェクトに直接アクセスできず、それらを作成したスレッド(UIスレッド)にディスパッチする必要があります。

于 2012-11-26T01:10:51.540 に答える
1

PathGeometryでオブジェクトを作成してbackground threadいるので、UIスレッドではなく、arc.pathGeometry.Dispatcherを提供します。Dispatcher of the background thread

あなたはあなたがこのようにできるあなたの処理を置く必要がありUI dispatcherます-

App.Current.Dispatcher.BeginInvoke((Action)(() =>
{
    MessageBox.Show(arc.pathGeometry.ToString());
}));
于 2012-11-26T06:56:24.970 に答える