-1

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

    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”语句和“Return string = minecraftFile.FileName;”之间 .. 使用调试器时,程序在这两行之间最多需要五秒钟的中断。中断后,它会返回并返回值,就好像没有任何问题一样。但 IntelliTrace 有时会出现“FileNotFound 异常”,即使程序从未向我显示任何错误消息,并按应有的方式将正确的值返回到文本框。

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

有什么问题?代码看起来像它应该的样子吗?

4

1 回答 1

3

两个基本问题可能会导致 OpenFileDialog 出现问题。首先是在您的机器上安装了行为不端的 shell 扩展,当您打开对话框时,它们将被加载到您的进程中。一项基本检查是,您没有看到 Notepad 的 File + Open 命令出现问题,并且当对话框处于活动状态时,您在 Visual Studio 输出窗口中看不到任何特别之处。启用非托管调试可为您提供更多信息。

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

如果这没有成功,那么我们需要有关行为不端的代码的更多信息。您需要启用非托管调试,项目 + 属性,调试选项卡。并启用微软符号服务器、工具+选项、调试、符号。并禁用 Just My Code 调试、工具 + 选项、调试、常规。在你让它行为不端并发布调用堆栈窗口的内容后,点击 Debug + Break All right。

于 2013-10-14T22:13:29.453 回答