这是在 Avalonia 中打开对话框的代码:
public async Task<TResult> ShowDialogAsync<TResult>()
{
return await GetWindow().ShowDialog<TResult>(m_target);
}
并且它运行成功。我试图摆脱异步等待:
public TResult ShowDialog<TResult>()
{
var result = GetWindow().ShowDialog<TResult>(m_target);
return result.Result;
}
但该对话框未呈现,并且无法关闭它。显然存在相互阻塞。以及如何解决这个问题?
为什么要让代码变得更糟?
在此代码中,在调用时,
await线程被释放并UI可以处理事件 - 绘制窗口、处理用户输入、绘制某些内容,一切都很棒。一旦对话框关闭,就会获取并返回工作结果。这里线程在等待任务结果时被阻塞
result.Result;控制权不会转移到任何地方。而且,显然,它是一个流UI,在任何系统中都是一个流。因此,它UI“挂起”,无法处理您想要显示的对话框,程序“紧紧挂起”。异步工作
UI非常棒,使用它,你不需要摆脱它。我把它留在这里:
如果您仔细查看源代码:那么当调用时,
ShowDialog它就会形成TaskCompletionSource,它订阅表单关闭事件并等待其执行。形式的发现和形成正是在流动中发生的UI。如果调用
Task.Result,调用线程将阻塞UI,窗体将没有时间显示,并且关闭事件将被挂起。如上所述,没有异步就没有办法。调用对话框的逻辑意味着阻塞主窗口、显示对话框、关闭对话框时接收
TResult/以及将控制返回到主窗口。DialogResult