あるスレッドで何かが作成され、別のスレッドから更新しようとしていると思いますが、WPFではこれを許可していません。オブジェクトは、作成されたスレッドからしか変更できません。
通常、すべてのオブジェクトはメインのUIスレッドで作成され、Dispatcherは非同期メッセージをUIスレッドに渡してこれらのオブジェクトを更新します。しかし、メインUIスレッドを使用する必要があるオブジェクトのプロパティを更新するために、バックグラウンドスレッドで重い処理を実行することはできます。
例えば、このようなものは動作します:
MyNotificationObject obj = new MyNotificationObject;
obj.Items = MethodThatRunsOnBackgroundThread();
List<SomeObject> MethodThatRunsOnBackgroundThread()
{
var list = new List<SomeObject>();
// Do Work
Return list;
}
これはないだろうが。それは更新するためのメッセージを送信しているので、ここで
MyNotificationObject obj = new MyNotificationObject;
MethodThatRunsOnBackgroundThread(obj);
void MethodThatRunsOnBackgroundThread()
{
var list = new List<SomeObject>();
// Do Work
// This won't work since obj was created on UI thread
obj.Items = List<SomeObject>;
}
は、作品別の例でありますオブジェクトを作成したUIスレッドに渡します。
MyNotificationObject obj = new MyNotificationObject;
MethodThatRunsOnBackgroundThread(obj);
void MethodThatRunsOnBackgroundThread()
{
var list = new List<SomeObject>();
// Load List
Application.Current.Dispatcher.BeginInvoke(DispatherPriority.Background,
new Action(delegate {
obj.Items = list;
}));
}
あなたの努力に感謝します、Rachel、しかし私はすでにこのアプローチを試みました。 Dispatcher.CurrentDispatcher.Invokeは機能しません。私はBas Bの答えに対するコメントとして書きました。 –
@ Bogdan0x400申し訳ありませんが、その構文は間違っています。 'Dispatcher.CurrentDispatcher'は現在のスレッドのディスパッチャを返します。バックグラウンドスレッドから呼び出すと、バックグラウンドスレッドのディスパッチャを返します。 UIスレッドのディスパッチャを取得するにはUIから呼び出すか、 'Application.Current.Dispatcher'のようなものを使用する必要があります。 'App.Current.Dispatcher'は、WPFプロジェクトの起動アプリケーションがデフォルトで' App'と呼ばれるため、通常見られる構文です。あなたの ''が別のものと呼ばれている場合は、代わりにそれを使用しなければなりません –
Rachel