あなたは、おそらくそれが起こっているのを示すために、命名規則を使用して(あなたのビューモデルにイベントを発生させることができ非UIスレッド(例えば、NotifyProgressChangedAsync)から呼び出されます。イベントに添付されているビューは、ディスパッチャを適切に処理できます。
または、(ビューからの)ビューモデルに同期関数にデリゲートを渡すことができます。 Application.Current
ですので:あなたはUIスレッドからExecute.InitializeWithDispatcher()
を呼び出す必要があります
public static class Execute
{
private static Action<System.Action> executor = action => action();
/// <summary>
/// Initializes the framework using the current dispatcher.
/// </summary>
public static void InitializeWithDispatcher()
{
#if SILVERLIGHT
var dispatcher = Deployment.Current.Dispatcher;
#else
var dispatcher = Dispatcher.CurrentDispatcher;
#endif
executor = action =>{
if(dispatcher.CheckAccess())
action();
else dispatcher.BeginInvoke(action);
};
}
/// <summary>
/// Executes the action on the UI thread.
/// </summary>
/// <param name="action">The action to execute.</param>
public static void OnUIThread(this System.Action action)
{
executor(action);
}
}
それを使用する前に、あなたが、私は通常Application.Current.Dispatcher
を使用して、このExecute.OnUIThread(()=>SomeMethod())
重複したhttp://stackoverflow.com/questions/486758/is-wpf-dispatcher-the-solution-of-multi-threading-problems? –
重複していません...彼はViewModel(通常はディスパッチャにアクセスできない)によって起動されたバックグラウンドスレッドからディスパッチャを取得する方法を尋ねています。 –