Я работаю с winforms в Windows 7, использую C # в Visual Studio 2010. В настоящее время в Windows 7 и из установки, и из отладчика работает приведенный ниже код.Однако, когда программа установлена в Windows XP, последняя строка никогда не достигается.
Этот код вызывается из MenuStrip, а затем передается последующему методу для выполнения действий, основанных на элементе, выбранном вменю.Однако это не единственное место, где происходит сбой SaveFileDialog, и всегда происходит сбой в методе ShowDialog ().
Код для MenuItem:
private void saveOnlyPlaylistToolStripMenuItem_Click(object sender, EventArgs e)
{
try
{
MainMenuClick(sender, e);
}
catch (Exception ex)
{
StackTrace st = new StackTrace();
string methodName = st.GetFrame(1).GetMethod().Name;
Logger.LogToFile("Failure in " + methodName + ": " + ex.Message);
}
}
Код, который не выполняется:
Logger.LogToFile("Entered Save Only Playlist.");
SaveFileDialog sfd = new SaveFileDialog();
string playlistSaveLocation = config["PlaylistLocation"];
if (!Directory.Exists(playlistSaveLocation))
Directory.CreateDirectory(playlistSaveLocation);
sfd.InitialDirectory = playlistSaveLocation;
sfd.Filter = "L Playlist (*.lpl)|*.lpl";
DialogResult result = sfd.ShowDialog();
Logger.LogToFile("Result of Dialog: " + result.ToString());
Я не могу понять, почему последняя строка не вызывается, похоже, что метод ShowDialog () в SaveFileDialog не завершается.После этого программа продолжает нормально работать, но больше не взаимодействует с каталогом файлов и не может создавать новые процессы.
В отладчике и в журнале событий не осталось ошибок.Я перестроил его на Windows XP, используя Visual Studio 2010, и он работал нормально, ошибка, кажется, появляется только тогда, когда программа создается в Windows 7, а затем устанавливается в Windows XP.Windows 7 является 64-битной.
Я должен отметить, что у меня есть все исключения из Debug -> Exceptions.
Я искал вокруг, и, кажется, не так много случаевсбой базового метода, такого как SaveFileDialog, есть идеи, что может вызвать эту проблему?
Дальнейший анализ, основанный на ответе ниже, привел меня к мысли, что, возможно, это как-то связано с тем, как SaveFileDialogназываетсяПоскольку это вызывается из MenuStrip, я считаю, что это выходит как отдельный поток.Это может быть причиной того, что метод ShowDialog () никогда не возвращается, но я не могу точно определить, почему это так.В попытке найти проблему, я создал отдельную форму окна, которая ничего не делала, но имела кнопку, чтобы открыть диалог сохранения файла.Эта кнопка работает и корректно возвращается, но при возврате управления обратно в исходный поток, похоже, снова выходит из строя.Все это основано на регистрации, которую я размещаю для целей отладки.
Код регистрации:
public static void LogToFile(string message, FileInfo fInfo)
{
try
{
if (!fInfo.Exists)
using (FileStream fs = fInfo.Create()) ;
message = DateTime.Now.ToString("yyyy-MM-dd hh-mm-ss") + ": " + message;
File.AppendAllText(fInfo.FullName, message + "\n");
}
catch (Exception ex)
{
StackTrace st = new StackTrace();
string methodName = st.GetFrame(1).GetMethod().Name;
MessageBox.Show("Failure in " + methodName + ": " + ex.Message);
}
}
Код для дополнительного окна:
public partial class Buffer : Form
{
public Buffer()
{
InitializeComponent();
}
private void Buffer_Load(object sender, EventArgs e)
{
Logger.LogToFile("Entered Save Only Playlist.");
SaveFileDialog sfd = new SaveFileDialog();
sfd.Filter = "Playlist (*.lpl)|*.lpl";
DialogResult result = System.Windows.Forms.DialogResult.Cancel;
try
{
result = sfd.ShowDialog();
}
catch (Exception ex)
{
MessageBox.Show("Dialog problem: " + ex.Message);
}
Logger.LogToFile("Result of Dialog: " + result.ToString());
MessageBox.Show("Result of Dialog: " + result.ToString());
DialogResult = result;
}
}
Код выше работаети MessageBox.Show () фактически показывает результат диалога.