C# - 如何将属性设置为Ui Thread

时间:2016-08-05 03:23:23

标签: c# uwp

我收到错误(来自HRESULT的异常:0x8001010E(RPC_E_WRONG_THREAD))。
这里应该是什么问题,我的资深开发人员说我需要将它设置为UI线程,这是我的代码:

private bool CanPrintReceipt() {
    return _receipt != null && !IsBusy;
}

private async void PrintReceipt() {
    IsBusy = true;
    try {
        await _printReceiptInteractor.PrintTerminalReceiptAsync(_receipt).ConfigureAwait(false);
        Dispatcher.Dispatch(() => {
            this.Close();
        });
    } catch (Exception e) {
        _log.Error($"{nameof(PrintReceipt)}: ", e);
        await this._dialogService
            .ShowMessageOKAsync(e.Message, "Printer Error");
    } finally {
        IsBusy = false; // but when i set this to true , no error
    }
}

我的其他课程出错了,

    public void RaisePropertyChanged([CallerMemberName]string propertyName = null)
    {
        if (Windows.ApplicationModel.DesignMode.DesignModeEnabled)
            return;

        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); //here it shows that error
    }

你们认为问题是什么?没有RunAsync,我看到了另一个解决方案 谢谢,
尼科

1 个答案:

答案 0 :(得分:2)

问题在于.ConfigureAwait(false)

它的作用是将continueOnCapturedContext设置为false,这意味着在调用异步函数的awit之后继续评估函数不一定是相同的线程。

所以在你的情况下,你不需要它,因为这正是你所需要的 - 在它完成后在同一个线程中恢复。

总的来说,简单的经验法则是:

  • 您在库代码中使用.ConfigureAwait(false)是一般用途且不处理用户界面
  • 否则你不会使用它。

详细信息:MSDN - Async/Await - Best Practices in Asynchronous Programming