Потоки переднего плана и фоновые потоки

После создания потока в управляемой среде .NET по умолчанию он существует как поток переднего плана. Это значит, что управляемая среда выполнения, а с ней и процесс, останутся активными до тех пор, пока активен этот поток.

Рассмотрим следующий код:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
using System;
using System.Threading;
public class EntryPoint
{
private static void ThreadFuncl ()  { 
Thread.Sleep ( 5000 ) ;
Console.WriteLine ( "Завершение дополнительного потока" );
}
static void Main()  { 
Thread threadl =
new Thread( new ThreadStart(EntryPoint.ThreadFuncl) ); 
threadl.Start();
Console.WriteLine ( "Завершение главного потока" );
}

Запустив этот код, вы увидите, что Main завершится до завершения дополнительного потока, как видно из следующего вывода:

  • Завершение главного потока
  • Завершение дополнительного потока
  • Разработчики С++ здесь обнаружат отличие от поведения, к которому они привыкли, где процесс обычно прерывается, как только завершается главная процедура приложения.

    Временами может потребоваться, чтобы процесс был завершен, когда завершается главный поток, несмотря на наличие дополнительных фоновых потоков. Чтобы во время выполнения превратить дополнительный поток в фоновый, необходимо установить свойство Thread.IsBackground в true.

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

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

    Поэтому, если поток работает с постоянно хранящимися данными, которые находятся в каком-то промежуточном состоянии, то его останов определенно плохо на них отразится.

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

    Такой механизм привносит дополнительную сложность, поскольку после отправки уведомления дополнительному потоку главный поток должен будет ждать в течение определенного времени, предоставляя дополнительному потоку возможность выполнить работу по очистке. В этой точке вполне разумно превратить поток обратно в поток переднего плана.

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

    Когда фоновый поток завершается по завершении процесса, он не принимает исключений, как в случае, когда кто-то вызовет Interrupt или Abort. Поэтому, если поток работает с постоянно хранящимися данными, которые находятся в каком-то промежуточном состоянии, то его останов определенно плохо на них отразится.

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

    Такой механизм привносит дополнительную сложность, поскольку после отправки уведомления дополнительному потоку главный поток должен будет ждать в течение определенного времени, предоставляя дополнительному потоку возможность выполнить работу по очистке. В этой точке вполне разумно превратить поток обратно в поток переднего плана.

    Вы можете следить за любыми ответами на эту запись через RSS 2.0 ленту. Вы можете оставить ответ, или trackback с вашего собственного сайта.

    Оставьте отзыв

    XHTML: Вы можете использовать следующие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

     
    Rambler's Top100