应用程序挂在DialogResult.OK上

时间:2013-10-14 21:59:25

标签: c# performance showdialog

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

    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异常”,即使程序从未向我显示任何错误消息,并将正确的值返回到文本框中。

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

可能有什么不对?代码看起来应该如何吗?

1 个答案:

答案 0 :(得分:3)

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

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

如果这没有成功,那么我们需要更多关于行为不端的代码的信息。您需要启用非托管调试,Project + Properties,Debug选项卡。并启用Microsoft符号服务器,工具+选项,调试,符号。并禁用Just My Code调试,工具+选项,调试,常规。点击调试+中断所有权限,然后让它出现行为错误并发布调用堆栈窗口的内容。