应用程序挂在 DialogResult.OK 上

本文关键字:OK DialogResult 应用程序 | 更新日期: 2023-09-27 18:35:15

在文件对话框中选择文件时,我的程序挂起时遇到了一些问题。这是显示文件浏览器对话框的代码:

    private void isForgeIncluded_btn_Click(object sender, EventArgs e)
    {
        this.isForgeIncluded.Text = FolderFileDialog("file", isForgeIncluded.Text, "Forge installer file (*.jar)|*.jar");
    }
    public string FolderFileDialog(string type, string current, string fileTypes = "All files (*.*)|*.*|All files (*.*)|*.*", string StartFolder = "C:''")
        string ReturnString = current;
        if (current != "")
        {
            StartFolder = Path.GetFullPath(current);
        }               
        if (type == "file")
        {
            OpenFileDialog minecraftFile = new OpenFileDialog();
            minecraftFile.Title = "Select file";
            minecraftFile.InitialDirectory = StartFolder;
            minecraftFile.RestoreDirectory = true;
            minecraftFile.Filter = fileTypes;
            if (minecraftFile.ShowDialog() == DialogResult.OK)
            {
                ReturnString = minecraftFile.FileName;
                return ReturnString;
            }
            minecraftFile = null;
        }
        return ReturnString; 
    }

我已经将问题缩小到"if"语句和"返回字符串= minecraftFile.FileName;"之间。使用调试器时,程序在这两行之间最多需要五秒钟的中断时间。中断后,它会返回并返回值,就好像没有任何问题一样。但是IntelliTrace有时会出现"FileNotFound Exception",即使程序从未向我显示任何错误消息,并按预期将正确的值返回到文本框。

奇怪的是,并非总是发生这种情况。它是随机的,即使我选择了与上次相同的文件,也可能会发生。我选择的文件也是系统驱动器上的本地文件。

可能出了什么问题?代码看起来是否正常?

应用程序挂在 DialogResult.OK 上

两个基本问题可能会导致 OpenFileDialog 出现问题。 首先是安装在计算机上的行为异常的 shell 扩展,当您打开对话框时,它们将被加载到您的进程中。 一个基本的检查是,你没有看到记事本的"文件 + 打开"命令的问题,并且在对话框处于活动状态时,你在 Visual Studio 输出窗口中看不到任何特殊内容。 启用非托管调试可提供更多信息。

第二个原因是 UI 线程的线程状态出现问题。 如果必须初始化为单线程单元才能正确显示此对话框。 返回到 Main() 方法,通常在 Program.cs 中,并确保它具有 [STAThread] 属性。

如果这没有成功,那么我们需要有关行为不端的代码的更多信息。 需要启用非托管调试、"项目 + 属性"、"调试"选项卡。 并启用Microsoft符号服务器、工具 + 选项、调试、符号。 并禁用"仅我的代码"调试、"工具 + 选项"、"调试"、"常规"。 点击 调试 + 中断所有 在让它行为不端并发布调用堆栈窗口的内容后立即进行。