RaisePropertyChanged和不同的线程

时间:2015-03-18 09:34:04

标签: c# xaml async-await mvvm-light

我的应用程序中出现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

  • 它并非一直没有发生

  • 我不从其他线程发送任何数据

你能帮我吗?

1 个答案:

答案 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)相同,因为它是默认值。