Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > .NET для новичков > Как реализованы события - это отдеьные нитки?


Автор: semibug 18.9.2010, 15:31
Запускаю калькулятор
Код

System.Diagnostics.Process  externalProg = new System.Diagnostics.Process();
externalProg.StartInfo.FileName = "calc.exe";
externalProg.EnableRaisingEvents = true;
externalProg.Exited += new EventHandler(prog_Exit);
externalProg.Start();

private static void prog_Exit(object sender, EventArgs e)
{
    MessageBox.Show("The program has been closed");
}


После запуска выполняю какие-то другие действия, условно бесконечный цикл.
Вопрос: по завершении работы калькулятора будет создан новый поток для выполнения prog_Exit?

Автор: Kaerus 18.9.2010, 16:19
В этом конкретном случае событие Process.Exited вызывается в другом потоке (взятом из системного пула потоков)
Цитата
When SynchronizingObject is null, methods handling the Exited event are called on a thread from the system thread pool. For more information on system thread pools, see ThreadPool.


А обычно новый поток не создается, к примеру события на форме выполняются все в одном потоке

Автор: semibug 18.9.2010, 17:44
Т.е. в обработчике события завершения необходимо обеспечить синхронизацию при доступе к данным?
Например в основном потоке идет заполнение массива строк, а в обработчике выбирается последний элемент, не может быть ситуации, когда массив был в промежуточном состоянии в момент обращения в событии завершения?

Автор: Kaerus 18.9.2010, 19:34
Опять так в этом конкретном случае - ДА

Автор: semibug 18.9.2010, 19:47
Kaerus, ок, спасибо
И смежный вопрос, если запустить процесс, с помощью System.Diagnostics.Process, а затем закончить свое приложение, что произойдет с запущенным процессом (он получает сообщение на закрытие/убивается/еще_что-то) ?

Автор: Kaerus 19.9.2010, 01:42
С помощью этого кода можно получить сообщение о закрытие родителя (проверил работает)
Код

var pc = new PerformanceCounter("Process", "Creating Process ID", Process.GetCurrentProcess().ProcessName);
Process parent = Process.GetProcessById((int)pc.NextValue());

parent.EnableRaisingEvents = true;
parent.Exited += (s, e) => Console.WriteLine("Родительское приложение закрылось");

Console.WriteLine("Press any key to exit ...");
Console.ReadKey();

Идея взята http://stackoverflow.com/questions/394816/how-to-get-parent-process-in-net-in-managed-way

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)