Поиск

Многопоточное приложение на С#

Прежде чем изучать способы использования потоков на С#, посмотрим, как легко создать вторичный поток на С#. Обсудив этот пример, я подробнее рассмотрю пространство имен System. Threading и особенно класс Thread. В этом примере я создаю второй поток в методе Main. Затем метод, ассоциированный со вторым потоком, выводит строку, сигнализирующую о вызове этого потока.

using System;
using System.Threading;
class SimpleThreadApp {
Public static void WorkerThreadMethodQ
{
Console.WriteLine("Worker thread started");
}
public static void Main() {
ThreadStart worker = new ThreadStart(WorkerThreadMethod);
Console.WriteLine("Main - Creating worker thread");
Thread t = new Thread(worker); t.StartQ;
Console.WriteLine
("Main - Have requested the start of worker thread"); } }

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

Первый новый элемент, на который следует обратить внимание, — это оператор using в пространстве имен System. Threading. Мы еще ознакомимся с этим пространством имен, а сейчас достаточно понимать, что оно содержит классы, необходимые для организации потоков в среде .NET. А теперь взгляните на первую строку метода Main:

ThreadStart WorkerThreadMethod = new ThreadStart(WorkerThreadMethod);

Каждый раз, наблюдая следующую форму записи, вы можете быть уверены, что х — это делегат, или, как вы узнали из главы 14, — определение сигнатуры метода:

х имя_переменной = new х(имя_метода)\

Итак, ThreadStart — это делегат, но необычный. Именно он должен быть задействован при создании нового потока. Он используется, чтобы задать метод, который должен вызываться как метод потока. Здесь я создаю экземпляр объекта Thread, при этом конструктор принимает в качестве аргумента только делегат ThreadStart:

Thread t = new Thread(worker);

После этого я вызываю метод Start объекта Thread, в результате чего вызывается метод WorkerThreadMethod.

И все! Три строки кода — для подготовки и запуска потока и самого метода потока — и все готово и работает. А теперь поговорим о пространстве имен System. Threading и его классах, благодаря которым все это происходит.