我的应用程序中出现RaisePropertyChanged失败的问题。在从另一个类接收消息后调用它。此消息在await
呼叫后发送。
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(Messenger,RaisePropertyChanged) 等)v.4.4
所有这些都发生在PortableClassLibrary
它并非一直没有发生
我不从其他线程发送任何数据
你能帮我吗?
答案 0 :(得分:2)
将ConfigureAwait更改为true,或删除ConfigureAwait。你想继续在GUI线程上处理。 如果您确定接下来的任何内容不需要在GUI线程上,您可以执行ConfigureAwait(false)。 Steven Cleary在互联网上提供了一些很好的解释。
http://blog.stephencleary.com/2012/07/dont-block-on-async-code.html
Best practice to call ConfigureAwait for all server-side code
它不会一直发生的原因是有时它会继续GUI线程,但是如果你做configureawait(true),你真的强迫它继续作为GUI线程。如果完全删除configureawait,则与configureawait(true)相同,因为它是默认值。