3.2 Базовые методы работы с потоками в C# .NET.

Базовые методы работы с потоками: создание потоков, запуск, ожидание завершения

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

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

Программа очень проста, так что давайте приступим.

Итак, сначала создайте новый проект, назовем его Thread_Step_1. В качестве шаблона выберите консольное приложение.

Сгенерированный оболочкой код первоначально выглядит следующим образом:
/*http://esate.ru, Anvi*/

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

namespace Thread_Step_1 
{ 

  class Program 
  { 
    static void Main(string[] args) 
    { 
    
    }
  }

} 


Для работы с потоками нам необходимо подключить пространстве имен System.Threading.

Добавьте строку using System.Threading после строки using System.Text.

Непосредственно перед функцией Main мы добавим функцию WriteString, которая будет отвечать за вывод символов, назначенных данному потоку (мы будем назначать номер потока) на экран. В качестве параметра функция будет получать объект _Data, который впоследствии будет преобразован в сроку в коде функции.

Код функции будет выглядеть следующим образом:
/*http://esate.ru, Anvi*/

static void WriteString(object _Data) 
{ 

  //для получения строки используем преобразование типов: 
  // приводим переменную _Data к типу string и записываем 
  // в переменную str_for_out 
  string str_for_out = (string) _Data; 
  // теперь поток 1 тысячу раз выведит полученную строку (свой номер) 
  for (int i = 0; i <= 1000; i++) 
  Console.Write(str_for_out);

} 


Теперь перейдем непосредственно к коду функции Main. Здесь мы реализуем следующий код:
  1. Сначала мы создадим 4 потока, каждому из которых укажем, что они будут выполнять функцию WriteString.
  2. Далее мы назначим потокам приоритеты.
  3. После этого мы запустим все четыре потока, передав в качестве параметра их номера.
  4. Далее нам останется только дождаться завершения все четырех потоков и ожидать ввода пользователем какого-либо символа, чтобы завершить выполнение программы.
Код функции Main теперь будет выглядеть следующим образом:
/*http://esate.ru, Anvi*/

static void Main(string[] args) //точка входа в программу 
{ 

  //создаем 4 потока, в качестве параметров передаем имя Выполняемой функции 
  Thread th_1 = new Thread(WriteString); 
  Thread th_2 = new Thread(WriteString); 
  Thread th_3 = new Thread(WriteString); 
  Thread th_4 = new Thread(WriteString); 

  //расставляем приоритеты для потоков 

  th_1.Priority = ThreadPriority.Highest; // самый высокий 
  th_2.Priority = ThreadPriority.BelowNormal; // выше среднего 
  th_3.Priority = ThreadPriority.Normal; // средний 
  th_4.Priority = ThreadPriority.Lowest; // низкий 

  // запускаем каждый поток, в качестве параметра передаем номер потока 

  th_1.Start( "1"); 
  th_2.Start( "2"); 
  th_3.Start( "3"); 
  th_4.Start( "4"); 

  Console.WriteLine( "все потоки запущены "); 
  //Ждем заврешения каждого потока 
  th_1.Join(); 
  th_2.Join(); 
  th_3.Join(); 
  th_4.Join(); 

  Console.ReadKey(); // прочитать символ (пока пользователь не нажмет клавишу программа не завершиться (чтобы можно было успеть посмотреть результат)). 

} 


Откомпилируйте и запустите программу (F5).

Пример результата работы программы можно увидеть на рисунке 1.

Также необходимо помнить, что при каждом запуске программы выводимый на экран результат будет отличаться от предыдущего. А если запустить созданное приложение не из среды Visual Studio (без отладки), а просто из операционной системы, то до вывода сообщения «Все потоки запущены» по несколько раз может успеть выполниться назначенная функция каждого потока.
Уроки OpenGL + C#: Пример выполнения многопоточного консольного приложения Рисунок 1. Пример выполнения многопоточного консольного приложения.
Как видно из рисунка, к моменту запуска последнего 4-го потока, 1-й поток, имеющий Highest (наивысший) приоритет уже успел полностью выполниться. Последний же 4-й приоритет, запущенный в добавок еще и последним, выполнится уже после всех остальных потоков.

Вот мы и познакомились с самыми примитивными методами, используемыми для работы с потоками. В следующей части главы сможете узнать о других интересных методах для работы с более реальными задачами многопоточного программирования.
Прикрепленные файлы для скачивания:
Добавить комментарий
Расширенный режим добавления комментариев доступен на форуме: загрузка изображений, цитирование, форматирование текста, и т.д.
Ваше имя:
Текст сообщения:
^