RaisePropertyChanged 和不同的线程
RaisePropertyChanged and different thread
我的应用程序中的 RaisePropertyChanged 失败时遇到问题。它在收到来自另一个 class 的消息后被调用。此消息是在 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
等)第 4.4 节
这一切都发生在 PortableClassLibrary
不是一直都在发生
我没有从另一个线程发送任何数据
你能帮帮我吗?
将 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) 相同,因为它是默认值。
我的应用程序中的 RaisePropertyChanged 失败时遇到问题。它在收到来自另一个 class 的消息后被调用。此消息是在 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 等)第 4.4 节
这一切都发生在 PortableClassLibrary
不是一直都在发生
我没有从另一个线程发送任何数据
你能帮帮我吗?
将 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) 相同,因为它是默认值。