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,我看到这是另一个解决方案
谢谢,
尼科
问题出在.ConfigureAwait(false)
上。
它所做的是将continueOnCapturedContext
设置为false
,这意味着在调用异步函数的awit
之后,不必是同一个线程来继续评估函数。
所以在你的情况下,你不需要它,因为这正是你需要的——在完成后在同一个线程中恢复。
一般来说,简单的经验法则是:
- 您在库代码中使用
.ConfigureAwait(false)
,它是通用的,不处理UI - 你不能用其他方式
详细信息:MSDN-Async/Await-异步编程的最佳实践