Приложение закрывается при выходе из процесса - PullRequest
2 голосов
/ 04 января 2012

Я делаю приложение формы, которое также запускает консольный процесс в другом потоке. Обычно мне нужно разблокировать кнопку после выхода из приложения. Раньше я делал обработчик событий, процесс после завершения просто останавливался, но теперь, после события, само приложение уничтожается.

Вот код для запуска процесса:

public void CallConsole()//This Calls the console application
{
    Thread.CurrentThread.IsBackground = true;
    Process p = new Process();
    p.StartInfo.UseShellExecute = false;
    p.StartInfo.RedirectStandardOutput = true;
    p.StartInfo.RedirectStandardError = true;
    p.StartInfo.FileName = filename;
    if (checkBox1.Checked)
       p.StartInfo.CreateNoWindow = true;
    p.EnableRaisingEvents = true;
    p.OutputDataReceived += new DataReceivedEventHandler(p_OutputDataReceived);
    p.ErrorDataReceived += new DataReceivedEventHandler(p_OutputDataReceived);
    p.Exited += new EventHandler(p_Exited);
    p.Disposed += new EventHandler(p_Exited);
    p.Start();
    p.BeginErrorReadLine();
    p.BeginOutputReadLine();
}

Я пытался работать со свойством Thread.IsBackground, но это ничего не изменило

Вот сам обработчик события:

void p_Exited(object sender, EventArgs e)//Process on exit or disposed will make button1 avalable
{
    button1.Enabled = true;
}

Есть идеи, почему приложение после добавления

p.EnableRaisingEvents = true;

теперь убит, а не только процесс?

Ответы [ 2 ]

2 голосов
/ 25 января 2012

Проблема заключалась в том, что

void p_Exited(object sender, EventArgs e)//Process on exit or disposed will make button1 available
{
    button1.Enabled = true;
}

требовал вызова и не имел какой-либо обработки ошибок.Однажды я добавил еще одну функцию, которая проверяет button1.InvokeRequired, и, если она снова вызывает себя через вызов, это сработало

1 голос
/ 05 февраля 2016

Проблема в том, что событие Exited запускается в потоке пула потоков. Элементы управления могут быть изменены только в потоке пользовательского интерфейса.

Вы можете вызвать BeginInvoke, но проще просто настроить объект Process для вызова самого себя, установив:

p.SynchronizingObject = button1;

Button реализует ISynchronizeInvoke, который объект Process использует для вызова своих событий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...