Захват .Net конец события - PullRequest
3 голосов
/ 21 мая 2009

Я бы хотел изящный способ захвата события окончания / завершения потока. Пока я нашел два подхода:

  1. Использовать фонового работника с событием RunWorkerCompleted, или,
  2. Пусть мой рабочий поток явно вызовет делегата "I'm Exiting".

Да, они будут работать, но должен быть какой-то путь от родительского потока (потока, который вызывает метод Thread.Start ()), чтобы определить, когда поток вышел, независимо от того, почему, как или когда. Например, окно вывода отладочной информации Visual Studio сообщает о выходе из потока :, "Поток 0x1454 вышел с кодом 0 (0x0)." Так что это должно быть возможно.

Заранее спасибо за любые идеи!

Ответы [ 4 ]

3 голосов
/ 21 мая 2009

Если у вас есть ссылка на Windows Forms, есть событие Application.ThreadExit .

Лично я обычно заключаю обработку своего потока в свои собственные классы (по многим причинам, в основном из-за того, что создание и запуск потока с большим количеством аргументов намного проще), что делает добавление события Complete тривиальным. Просто попросите код выполнения потока вызвать ваш рабочий делегат потока, а затем вызвать событие complete.

1 голос
/ 21 мая 2009

вы можете использовать thread.join (), это блокирующая команда, но она будет продолжать выполнять com и sendMessage

Thread t = new Thread (delegate() { Console.ReadLine(); });

t.Start();

t.Join();    // Wait until thread t finishes

Console.WriteLine ("Thread t's ReadLine complete!");
1 голос
/ 21 мая 2009

вы можете опросить свойства ThreadState или IsAlive из родительской темы

0 голосов
/ 27 февраля 2012

Если кто-то ищет в Google:

Я бы использовал вариант 2 в слегка измененном виде. Используйте ManualResetEvent (или AutoResetEvent) и дайте родительскому потоку дождаться выхода вашего потока с помощью метода WaitOne.

using(ManualResetEvent completed = new ManualResetEvent(false))
{

var thread = new Thread(new ThreadStart(delegate()
{
    try
    {
        // do work here
    }
    finally
    {
        completed.Set();
    }

}));

// start thread
thread.Start();


// wait until thread is completed
completed.WaitOne();
}

Вы также можете использовать Thread.Join (), который предлагает AndrewB, но я предпочитаю ManualResetEvent, поскольку он дает вам больше контроля над тем, как и когда он вызывается.

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