Жанры книг
Мы в соц.сетях
ParaKnig📚 » Компьютеры и Интернет » Базы данных » Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю
<< На главную

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

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

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 278 279 280 281 282 283 284 285 286 ... 642
Перейти на страницу:

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

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

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

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

Thread primaryThread = Thread.CurrentThread;

primaryThread.Name = &quot;Primary&quot;;

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

Console.WriteLine(&quot;-&gt; {0} is executing Main()&quot;,

Thread.CurrentThread.Name);

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

Printer p = new Printer();

switch(threadCount)

{

  case &quot;2&quot;:

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

    Thread backgroundThread =

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

    backgroundThread.Name = &quot;Secondary&quot;;

    backgroundThread.Start();

    break;

 case &quot;1&quot;:

    p.PrintNumbers();

    break;

  default:

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

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

}

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

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

Console.ReadLine();

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

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

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

(window.adrunTag = window.adrunTag || []).push({v: 1, el: 'adrun-4-390', c: 4, b: 390})

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(&quot;ID of thread in Add(): {0}&quot;,

        Thread.CurrentThread.ManagedThreadId);

    Console.WriteLine(&quot;{0} + {1} is {2}&quot;,

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

  }

}

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

using System;

using System.Threading;

using AddWithThreads;

Console.WriteLine(&quot;***** Adding with Thread objects *****&quot;);

Console.WriteLine(&quot;ID of thread in Main(): {0}&quot;,

  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:

1 ... 278 279 280 281 282 283 284 285 286 ... 642
Перейти на страницу:
На этой странице вы можете бесплатно читать книгу Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю бесплатно.
Комментарии
Открыть боковую панель
Комментарии
Лариса
Лариса 11.03.2026 - 20:17
Странно,здесь имя девочки Аграфена,а на других сайтах я прослушала три книги этого цикла с именем Дарвина.Зачем менять имя и путать читателей? Опечатка- не Дарвина,  а  Дарина.
Григорий
Григорий 09.04.2025 - 22:24
Лучшая книга всех времен
Женя
Женя 02.04.2025 - 16:08
Любимая книга