c# - 为什么 ShowDialog 响应在异步事件处理程序中延迟?
问题描述
在我的.NET Framework 4.5
Windows 窗体项目中,我有一个异步事件处理程序。在事件处理程序中,我打开一个OpenFileDialog
with ShowDialog()
。然后我想对选定的文件做一些异步的事情。但我有一些奇怪的行为:关闭对话框(使用Cancel
或OK
按钮)后,我有 9 秒的延迟,直到ShowDialog
返回结果。而这一次应用程序被冻结。
这是我的代码:
private async void buttonBrowse_Click(object sender, EventArgs e)
{
DialogResult result = this.openFileDialog.ShowDialog(this);
if (result != DialogResult.OK) // <- delayed more than 9 seconds after user closes dialog
return;
await this.LoadFileAsync(this.openFileDialog.FileName);
}
删除关键字async
后,代码将按预期运行:
private void buttonBrowse_Click(object sender, EventArgs e)
{
DialogResult result = this.openFileDialog.ShowDialog(this);
if (result != DialogResult.OK) // -> no delay here
return;
this.LoadFileAsync(this.openFileDialog.FileName); // works, but compiler warning, because missing (await-keyword)
}
有人可以解释这种行为吗?谢谢。
是的,我知道解决方法:我可以使用对话框的事件处理程序FileOk
并将我的代码移动到此事件处理程序。但我对记录在案的行为感到好奇。
解决方案
我试了一下。我想我错了。它不依赖于async
关键字。
这似乎是一个 Windows 窗体错误。另请参阅:调用 OpenFileDialog.ShowDialog() 时 Windows 窗体 GUI 挂起
如果我将ShowHelp
属性设置为true
. 然后它立即工作。但它是一个不同的打开文件对话框(至少在最新的 Windows 10 上)。
this.openFileDialog.ShowHelp = true;
推荐阅读
- python - 为什么替换 DataFrame 中的值也会替换原始 DataFrame 中的值
- spring - Sort.of 中的 Spring 自定义排序
- c++ - 将参数传递给回调函数的最佳方法是什么?(C & C++)
- ios - 如何在 CoreData 的 ValueTransformer 中使用 CryptoKit 加密用户的敏感数据?
- python - 优化最小化不等式约束不兼容和成功:当边界之一为 [a,a] 时,SLSQP 为假
- excel - 使用具有不同日期格式的 COUNTIFS
- javascript - 使用 Javascript 将圆形文本插入 SVG 中的部分
- ios - 将 UIView 数据传递给 Appium
- windows-task-scheduler - 跨时区同步
- ruby-on-rails - 通过 Docker 运行原因:“Unix 域套接字上的连接“/var/run/postgresql/.s.PGSQL.5432”?