2015-03-18 6 views
0

У меня проблема с отказом RaisePropertyChanged в моем приложении. Он вызывается после получения сообщения из другого класса. Это сообщение отправляется после вызова await.RaisePropertyChanged и другая тема

var storedData = await localFolder.GetFileContentAsync("data.json").ConfigureAwait(false); 
if (!string.IsNullOrEmpty(storedData)) 
{ 
    snags = JsonConvert.DeserializeObject<Data>(storedData); 
    messenger.Send(new ChangeDataCountMessage()); 
} 

неудовлетворительную RaisePropertyChanged

public Data DataProperty 
{ 
    get { return dataProperty; } 
    set 
    { 
     dataProperty = value; 
     RaisePropertyChanged(); 
    } 
} 

Этот вызов RaisePropertyChanged бросает исключение

An exception of type 'System.Runtime.InteropServices.COMException' occurred in System.dll but was not handled in user code 

Additional information: The application called an interface that was marshalled for a different thread. (Exception from HRESULT: 0x8001010E (RPC_E_WRONG_THREAD)) 

Дополнительная информация:

  • Я использую портативный GalaSoft.MvvmLight (Messe nger, RaisePropertyChanged и т.д.) v. 4.4

  • все это происходит в PortableClassLibrary

  • это не происходит все время

  • Я не отправлять какие-либо данные из другого потока

Не могли бы вы помочь мне, пожалуйста?

ответ

2

Изменить ConfigureAwait в true или удалить ConfigureAwait. вы хотите продолжить обработку в потоке графического интерфейса. Вы можете сделать ConfigureAwait (false), если вы уверены, что все, что приходит дальше, не обязательно должно быть в потоке графического интерфейса. В Интернете есть несколько хороших объяснений от Стивена Клири.

http://blog.stephencleary.com/2012/07/dont-block-on-async-code.html

Best practice to call ConfigureAwait for all server-side code

Причина, почему это не происходит все время, что иногда это GUI поток, который будет продолжаться, но если вы configureawait (истина), вы действительно заставляющую это будет поток GUI для продолжения. Если вы полностью отмените configureawait, это будет такое же, как configureawait (true), потому что оно по умолчанию.

+0

Большое спасибо. Я был смущен, потому что везде, где я читал, лучшей практикой является ConfigureAwait (false). Но верно то, что я не понимал, почему :) –