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

本文关键字:设置 Ui-Thread 属性 C#- | 更新日期: 2023-09-27 18:01:07

我收到一个错误(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,我看到这是另一个解决方案
谢谢,
尼科

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

问题出在.ConfigureAwait(false)上。

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

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

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

  • 您在库代码中使用.ConfigureAwait(false),它是通用的,不处理UI
  • 你不能用其他方式

详细信息:MSDN-Async/Await-异步编程的最佳实践