在文件对话框中选择文件时,我的程序挂起了一些问题。这是显示文件浏览器对话框的代码:
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异常”,即使程序从未向我显示任何错误消息,并将正确的值返回到文本框中。
奇怪的是,并非总是会发生这种情况。它是随机的,即使我选择与上次相同的文件也可能发生。我选择的文件也是系统驱动器上的本地文件。
可能有什么不对?代码看起来应该如何吗?
答案 0 :(得分:3)
两个基本问题可能会导致OpenFileDialog出现问题。首先是在您的机器上安装了行为不当的shell扩展,当您打开对话框时,它们将被加载到您的进程中。基本检查是您没有看到Notepad的File + Open命令出现问题,并且在对话框处于活动状态时您在Visual Studio输出窗口中看不到任何特殊内容。启用非托管调试可为您提供更多信息。
第二个原因是UI线程的线程状态出现问题。如果必须初始化为单线程单元,以便能够正确显示此对话框。返回到Main()方法,通常在Program.cs中,并确保它具有[STAThread]属性。
如果这没有成功,那么我们需要更多关于行为不端的代码的信息。您需要启用非托管调试,Project + Properties,Debug选项卡。并启用Microsoft符号服务器,工具+选项,调试,符号。并禁用Just My Code调试,工具+选项,调试,常规。点击调试+中断所有权限,然后让它出现行为错误并发布调用堆栈窗口的内容。