Шаг 241.
Язык программирования C#. Начала.
Многопоточное программирование. Фоновые потоки

    На этом шаге мы рассмотрим назначение и пример использования такого потока.

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

    У каждого объекта потока есть свойство IsBackground. Свойство может принимать значение true или false. Если свойство IsBackground объекта потока равно true, то поток является фоновым. Если значение свойства IsBackground объекта потока равно false, то поток является приоритетным. По умолчанию значение свойства IsBackground для объектов потоков равно false, поэтому все потоки, которые мы создавали ранее, были приоритетными. Если мы хотим создать фоновый поток, то необходимо свойству IsBackground объекта этого потока присвоить значение true. Пример создания фонового потока представлен в примере ниже.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.Threading;

namespace pr241_1
{
    // Класс с главным методом:
    class Program
    {
        // Статический метод для выполнения в фоновом потоке: 
        static void run() {
            // Отображение сообщения:
            Console.WriteLine("Дочерний поток запущен...");
            // Целочисленная переменная: 
            int k = 1;
            // Бесконечный цикл: 
            while(true) {
                // Отображение сообщения:
                Console.WriteLine("Дочерний поток: " + k);
                // Увеличение значения переменной: 
                k++;
                // Задержка в выполнении потока: 
                Thread.Sleep(2100);
            }
        }

        // Главный метод: 
        static void Main()
        {
            // Отображение начального сообщения: 
            Console.WriteLine("Главный поток запущен..."); 
            // Создание объекта потока:
            Thread t = new Thread(run);
            // Фоновый поток: 
            t.IsBackground = true;
            // Запуск фонового потока: 
            t.Start();
            // Конструкция цикла: 
            for(char s='A'; s<='F'; s++) {
                // Отображение сообщения: 
                Console.WriteLine("Главный поток: " + s);
                // Задержка в выполнении главного потока: 
                Thread.Sleep(1000);
            }
            // Отображение последнего сообщения: 
            Console.WriteLine("Главный поток завершен...");
            // Задержка:
            // Console.ReadLine();
        }
    }
}
Архив проекта можно взять здесь.


Не забудьте запустить приложение комбинацией клавиш CTRL+F5.

    Возможный результат выполнения программы представлен ниже:


Рис.1. Результат работы приложения

    Особенность этого примера в том, что метод run(), который выполняется в дочернем потоке, содержит бесконечный цикл (в конструкции while условием указано true). Теоретически такой метод (или поток на его основе) должен был бы работать бесконечно. Но поток, который создается на основе метода run(), является фоновым. Он становится фоновым после выполнения команды

  t.IsBackground = true;   , 
где t является объектом потока. Поэтому после запуска (команда
  t.Start(); 
) дочерний фоновый поток выполняется до тех пор, пока выполняется породивший его главный поток. При завершении главного потока дочерний фоновый поток завершается автоматически.

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

    На следующем шаге мы рассмотрим операции с потоками.




Предыдущий шаг Содержание Следующий шаг