2012-02-02 11 views
1

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() 

これは何のためですか?前もって感謝します!

+0

あなたのコードは、別のスレッドからUIスレッドでvisualSTATEのにアクセスして設定しようとしている、VisualStateManager上のディスパッチャを使用するようにしてくださいコール。 – BigL

答えて

4

MVVVMLightを使用すると、DispatcherHelperを使用してUIスレッド(問題)でコードが実行されるようにすることができます。

DispatcherHelper.CheckBeginInvokeOnUI(YOUR-ACTION); 
関連する問題