MVVMライトツールキットのMessengerクラスを使用してWP7アプリケーションのさまざまな部分を通信しています。MVVMライト付きWP7プロジェクトでUnauthorizedAccessException(クロススレッドアクセスが無効です)が発生しました
私のアプリケーションのクラスからメッセージを受け取ったときに別の状態になるようにしようとしています。ビューのコードビハインドでは、私がメッセージを登録します。
Messenger.Default.Register<PageActionMessage>
(
this,
(action) => GoToPage(action)
);
をし、それを受信したときに次のメソッドを呼び出します。私の他のクラスでは
private object GoToPage(PageActionMessage action)
{
if (action.action == PageAction.TwitterAuthFinished)
{
if (IsoStoreHelper.CheckIfAuthorized())
{
VisualStateManager.GoToState(this, "TwitterSendPage", true); // The exception is thrown here
}
}
}
を、メッセージがこのように放送されています
var PageMsg = new PageActionMessage()
{
action = PageAction.TwitterAuthFinished
};
Messenger.Default.Send<PageActionMessage>(PageMsg);
このメッセージは、ビューによって正しく受信されますが、VisualStateManagerのGoToStateメソッドを呼び出すときに、フォローでUnauthorizedAccessException(無効なクロススレッドアクセス)がスローされます。ローディングトレース:
System.UnauthorizedAccessException was unhandled
Message=Invalid cross-thread access.
StackTrace:
at MS.Internal.XcpImports.CheckThread()
at System.Windows.DependencyObject.GetValueInternal(DependencyProperty dp)
at System.Windows.FrameworkElement.GetValueInternal(DependencyProperty dp)
at System.Windows.DependencyObject.GetValue(DependencyProperty dp)
at System.Windows.Controls.Panel.get_Children()
at MS.Internal.XcpImports.CheckThread()
at MS.Internal.XcpImports.Control_GetImplementationRoot(Control control)
at System.Windows.Controls.Control.get_ImplementationRoot()
at System.Windows.VisualStateManager.GoToState(Control control, String stateName, Boolean useTransitions)
at KidsBook.MainPage.GoToPage(PageActionMessage action)
at KidsBook.MainPage.<.ctor>b__0(PageActionMessage action)
at GalaSoft.MvvmLight.Helpers.WeakAction`1.Execute(PageActionMessage parameter)
at GalaSoft.MvvmLight.Helpers.WeakAction`1.ExecuteWithObject(Object parameter)
at GalaSoft.MvvmLight.Messaging.Messenger.SendToList[TMessage](PageActionMessage message, IEnumerable`1 list, Type messageTargetType, Object token)
at GalaSoft.MvvmLight.Messaging.Messenger.SendToTargetOrType[TMessage](PageActionMessage message, Type messageTargetType, Object token)
at GalaSoft.MvvmLight.Messaging.Messenger.Send[TMessage](PageActionMessage message)
at KidsBook.Twitter.OAuthClient.GetResponse(IAsyncResult result)
at System.Net.Browser.ClientHttpWebRequest.<>c__DisplayClassa.<InvokeGetResponseCallback>b__8(Object state2)
at System.Threading.ThreadPool.WorkItem.WaitCallback_Context(Object state)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadPool.WorkItem.doWork(Object o)
at System.Threading.Timer.ring()
これは何のためですか?前もって感謝します!
あなたのコードは、別のスレッドからUIスレッドでvisualSTATEのにアクセスして設定しようとしている、VisualStateManager上のディスパッチャを使用するようにしてくださいコール。 – BigL