C# 应用程序挂起DialogResult.OK

C# 应用程序挂起DialogResult.OK,c#,performance,showdialog,C#,Performance,Showdialog,在文件对话框中选择文件时,我的程序挂起时遇到一些问题。这是显示“文件浏览器”对话框的代码: private void isForgeIncluded_btn_Click(object sender, EventArgs e) { this.isForgeIncluded.Text = FolderFileDialog("file", isForgeIncluded.Text, "Forge installer file (*.jar)|*.jar"); }

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

    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异常”,即使该程序从未向我显示任何错误消息,并按其应该的方式向文本框返回正确的值

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


有什么不对劲吗?代码看起来像它应该的样子吗?

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

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


如果这还不能实现,那么我们需要更多关于错误代码的信息。您需要启用非托管调试、项目+属性、调试选项卡。并启用Microsoft符号服务器、工具+选项、调试、符号。并仅禁用我的代码调试、工具+选项、调试、常规。在您使其行为异常并发布调用堆栈窗口的内容后,点击Debug+Break All right。

最后一个:
if(minecraftFile.ShowDialog()==DialogResult.OK){
是您在本地磁盘上浏览的文件/目录吗?是的,这些文件是前面提到的本地文件。我的结论是,它一定是某个shelle扩展。不知道会发生什么,因为它在我的笔记本电脑和主pc上。您关于记事本的提示证明它不是我的代码,因为它也发生在记事本上。但是,在我工作的pc上,它是我的没有问题。谢谢提示!这可能对其他人有用!使用SysInternals Autoruns实用程序禁用shell扩展。