2013-10-14 1 views
-1

У меня есть некоторые проблемы с моей программой, зависающими при выборе файла в диалоговом окне файла. Это код, который показывает диалоговое окно браузера файлов:Приложение, зависающее на DialogResult.OK

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; 
    } 

Я сузил проблему вплоть до между «если» заявлением и «Возвращением строки = minecraftFile.FileName;» .. При использовании отладчика программа занимает до пяти секундного разрыва между этими двумя строками. После его разрыва он возвращается и возвращает значение, как будто ничего не случилось. Но IntelliTrace иногда сталкивается с «FileNotFound Exception», хотя программа никогда не показывает мне никаких сообщений об ошибках и возвращает правильное значение в текстовое поле.

Первейшая часть заключается в том, что это не всегда происходит. Его случайный и может произойти, даже если я выбираю тот же файл, что и в прошлый раз. Файлы, которые я выбираю, также являются локальными файлами на системном диске.

Что может быть неправильным? Как выглядит код?

+0

Последний из них: 'if (minecraftFile.ShowDialog() == DialogResult.OK) {' –

+0

Является ли файл/каталог, который вы просматриваете на локальном диске? – codemonkeh

+0

Да, файлы являются локальными файлами, как указано ранее. –

ответ

3

Две основные проблемы могут вызвать проблемы с OpenFileDialog. Во-первых, это неправильное расширение оболочки, установленное на вашем компьютере, и они будут загружены в ваш процесс при открытии диалогового окна. Основная проверка заключается в том, что вы не видите проблем с командой «Файл + Открыть» в Notepad и что вы не видите ничего особенного в окне вывода Visual Studio во время активного диалога. Включение неуправляемой отладки дает вам больше информации.

Вторая причина связана с состоянием потока вашего потока пользовательского интерфейса. Если необходимо инициализировать как однопоточную квартиру, чтобы иметь возможность правильно отображать этот диалог. Вернитесь к своему методу Main(), обычно в Program.cs, и убедитесь, что он имеет атрибут [STAThread].

Если это не отключается, нам нужна дополнительная информация о коде, который является неправильным. Вам нужно включить неуправляемую отладку, вкладку «Проект + Свойства», вкладку «Отладка». И включите сервер символов Microsoft, Инструменты + Параметры, Отладка, Символы. И отключите отладку Just My Code, Tools + Options, Debugging, General. Hit Debug + Break Все сразу после того, как вы получите это, чтобы небрежно и опубликовать содержимое окна «Стек вызовов».

+0

Мое заключение состоит в том, что это должно быть некоторое расширение стеллажа. Не знаю, что, хотя, как на моем ноутбуке, так и на главном ПК. Ваша подсказка с помощью блокнота доказала, что это не мой код, как это происходит и в блокноте. Однако на моем компьютере на работе нет проблем. Спасибо за советы! Это может быть полезно для других людей! –

+0

Используйте служебную программу SysInternals Autoruns для отключения расширений оболочки. –