2012-01-04 3 views
2

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

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

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; 

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

+0

@ HansPassant Спасибо! – TheBW

ответ

2

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

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

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

1

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

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

p.SynchronizingObject = button1; 

ButtonISynchronizeInvoke реализует, которую Process объект использует для вызова его события.

+0

Я искал такой ответ. Огромное спасибо. – Hari

+0

@ Хари не беспокоится, ты очень рад. –

Смежные вопросы