首页 > 解决方案 > 为什么 ShowDialog 响应在异步事件处理程序中延迟?

问题描述

在我的.NET Framework 4.5Windows 窗体项目中,我有一个异步事件处理程序。在事件处理程序中,我打开一个OpenFileDialogwith ShowDialog()。然后我想对选定的文件做一些异步的事情。但我有一些奇怪的行为:关闭对话框(使用CancelOK按钮)后,我有 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并将我的代码移动到此事件处理程序。但我对记录在案的行为感到好奇。

标签: c#winformsasync-awaitmodal-dialog

解决方案


我试了一下。我想我错了。它不依赖于async关键字。

这似乎是一个 Windows 窗体错误。另请参阅:调用 OpenFileDialog.ShowDialog() 时 Windows 窗体 GUI 挂起

如果我将ShowHelp属性设置为true. 然后它立即工作。但它是一个不同的打开文件对话框(至少在最新的 Windows 10 上)。

this.openFileDialog.ShowHelp = true;

推荐阅读