books-read.com
books-read.com » Компьютеры и Интернет » Базы данных » Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю

Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю

Наш ресурс дает возможность бесплатно читать книгу онлайн Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю. Жанр: Базы данных . Сайт books-read.com дает возможность читать полную версию книги без регистрации и sms. Все книги онлайн, не надо качать fb2, epub, txt.
Добавить книгу Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю в приложение ЧИТАТЬ КНИГУ ОФЛАЙН в приложении ios/android
Перейти на страницу:

Console.WriteLine("***** The Amazing Thread App *****n");

Console.Write("Do you want [1] or [2] threads? ");

string threadCount = Console.ReadLine();   // Запрос количества потоков

// Назначить имя текущему потоку.

Thread primaryThread = Thread.CurrentThread;

primaryThread.Name = "Primary";

// Вывести информацию о потоке.

Console.WriteLine("-> {0} is executing Main()",

Thread.CurrentThread.Name);

// Создать рабочий класс.

Printer p = new Printer();

switch(threadCount)

{

  case "2":

    // Создать поток.

    Thread backgroundThread =

      new Thread(new ThreadStart(p.PrintNumbers));

    backgroundThread.Name = "Secondary";

    backgroundThread.Start();

    break;

 case "1":

    p.PrintNumbers();

    break;

  default:

    Console.WriteLine("I don't know what you want...you get 1 thread.");

    goto case "1";   // Переход к варианту с одним потоком

}

// Выполнить некоторую дополнительную работу.

Console.WriteLine("This is on the main thread, and we are finished.");

Console.ReadLine();

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

Thread
.

Работа с делегатом ParametrizedThreadStart

Вспомните, что делегат

ThreadStart
может указывать только на методы, которые возвращают
void
и не принимают аргументов. В некоторых случаях это подходит, но если нужно передать данные методу, выполняющемуся во вторичном потоке, тогда придется использовать тип делегата
ParametrizedThreadStart
. В целях иллюстрации создайте новый проект консольного приложения по имени
AddWithThreads
и импортируйте пространство имен
System.Threading
. С учетом того, что делегат
ParametrizedThreadStart
может указывать на любой метод, принимающий параметр типа
System.Object
, постройте специальный тип, который содержит числа, подлежащие сложению:

namespace AddWithThreads

{

  class AddParams

  {

    public int a, b;

    public AddParams(int numb1, int numb2)

    {

      a = numb1;

      b = numb2;

    }

  }

}

Далее создайте в классе

Program
статический метод, который принимает параметр
AddParams
и выводит на консоль сумму двух чисел:

void Add(object data)

{

  if (data is AddParams ap)

  {

    Console.WriteLine("ID of thread in Add(): {0}",

        Thread.CurrentThread.ManagedThreadId);

    Console.WriteLine("{0} + {1} is {2}",

        ap.a, ap.b, ap.a + ap.b);

  }

}

Код в файле

Program.cs
прямолинеен. Вместо типа
ThreadStart
просто используется
ParametrizedThreadStart
:

using System;

using System.Threading;

using AddWithThreads;

Console.WriteLine("***** Adding with Thread objects *****");

Console.WriteLine("ID of thread in Main(): {0}",

  Thread.CurrentThread.ManagedThreadId);

// Создать объект AddParams для передачи вторичному потоку.

AddParams ap = new AddParams(10, 10);

Thread t = new Thread(new ParameterizedThreadStart(Add));

t.Start(ap);

// Подождать, пока другой поток завершится.

Thread.Sleep(5);

Console.ReadLine();

Класс AutoResetEvent

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

Sleep()
вызывался с произвольным временным периодом, чтобы дать возможность другому потоку завершиться. Простой и безопасный к потокам способ заставить один поток ожидать, пока не завершится другой поток, предусматривает применение класса
AutoResetEvent
. В потоке, который должен ожидать, создайте экземпляр
AutoResetEvent
и передайте его конструктору значение
false
, указав, что уведомления пока не было. Затем в точке, где требуется ожидать, вызовите метод
WaitOne()
. Ниже приведен модифицированный класс
Program
, который делает все описанное с использованием статической переменной-члена
AutoResetEvent
:

Перейти на страницу:

Троелсен Эндрю читать все книги автора по порядку

Троелсен Эндрю - на сайте онлайн книг books-read.com Вы можете читать полные версии книг автора в одном месте.


Язык программирования C#9 и платформа .NET5 отзывы

Отзывы читателей о книге Язык программирования C#9 и платформа .NET5, автор: Троелсен Эндрю. Читайте комментарии и мнения людей о произведении.


Уважаемые читатели и просто посетители нашей библиотеки! Просим Вас придерживаться определенных правил при комментировании литературных произведений.

  • 1. Просьба отказаться от дискриминационных высказываний. Мы защищаем право наших читателей свободно выражать свою точку зрения. Вместе с тем мы не терпим агрессии. На сайте запрещено оставлять комментарий, который содержит унизительные высказывания или призывы к насилию по отношению к отдельным лицам или группам людей на основании их расы, этнического происхождения, вероисповедания, недееспособности, пола, возраста, статуса ветерана, касты или сексуальной ориентации.
  • 2. Просьба отказаться от оскорблений, угроз и запугиваний.
  • 3. Просьба отказаться от нецензурной лексики.
  • 4. Просьба вести себя максимально корректно как по отношению к авторам, так и по отношению к другим читателям и их комментариям.

Надеемся на Ваше понимание и благоразумие. С уважением, администратор books-read.com


Прокомментировать
Подтвердите что вы не робот:*