UnauthorizedAccessException (недопустимый межпоточный доступ), выброшенный в проекте WP7 с MVVM Light - PullRequest
1 голос
/ 02 февраля 2012

Я использую класс Messenger набора инструментов MVVM light для связи различных частей моего приложения WP7.

Я пытаюсь перевести представление в другое состояние при получении сообщения из класса моего приложения. В коде представления я регистрируюсь на сообщение:

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

Это сообщение правильно получено представлением, но при вызове метода GoToState в VisualStateManager генерируется исключение 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()

С чем это связано? Заранее спасибо!

Ответы [ 2 ]

4 голосов
/ 02 февраля 2013

это мое решение:

http://wp8xp.blogspot.com.es/2013/02/llamadas-asincronas-internet-haciendo.html

Deployment.Current.Dispatcher.BeginInvoke(() =>
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            });
4 голосов
/ 02 февраля 2012

С MVVVMLight вы можете использовать DispatcherHelper, чтобы обеспечить выполнение кода в потоке пользовательского интерфейса (ваша проблема).
например,

DispatcherHelper.CheckBeginInvokeOnUI(YOUR-ACTION);
...