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

附加信息:

你能帮帮我吗?

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