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

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

Читать бесплатно Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю. Жанр: Базы данных год 2004. Так же читаем полные версии (весь текст) онлайн без регистрации и SMS на сайте kniga-online.club или прочесть краткое содержание, предисловие (аннотацию), описание и ознакомиться с отзывами (комментариями) о произведении.
Перейти на страницу:

    // Вывести числа.

    Console.Write("Your numbers: ");

    for (int i = 0; i < 10; i++)

    {

      Random r = new Random();

      Thread.Sleep(1000 * r.Next(5));

      Console.Write("{0}, ", i);

    }

    Console.WriteLine();

  }

  finally

  {

    Monitor.Exit(threadLock);

  }

}

Первым делом обратите внимание, что конечным получателем маркера потока, который указывается как аргумент ключевого слова lock, является метод Monitor. Enter(). Весь код внутри области lock помещен внутрь блока try. Соответствующий блок finally гарантирует освобождение маркера блокировки (посредством метода Monitor.Exit()), даже если возникнут любые исключения времени выполнения. Модифицировав программу MultiThreadShareData с целью прямого применения типа Monitor (как только что было показано), вы обнаружите, что вывод идентичен.

С учетом того, что ключевое слово lock требует написания меньшего объема кода, чем при явной работе с типом System.Threading.Monitor, может возникнуть вопрос о преимуществах использования этого типа напрямую. Выражаясь кратко, тип Monitor обеспечивает большую степень контроля. Применяя тип Monitor, можно заставить активный поток ожидать в течение некоторого периода времени (с помощью статического метода Monitor.Wait()), информировать ожидающие потоки о том, что текущий поток завершен (через статические методы Monitor.Pulse() и Monitor.PulseAll()), и т.д.

Как и можно было ожидать, в значительном числе случаев ключевого слова lock будет достаточно. Если вас интересуют дополнительные члены класса Monitor, тогда обращайтесь в документацию по .NET Core.

Синхронизация с использованием типа System.Threading.Interlocked

Не заглядывая в код CIL, обычно нелегко поверить в то, что присваивание и простые арифметические операции не являются атомарными. По указанной причине в пространстве имен System.Threading предоставляется тип, который позволяет атомарно оперировать одиночным элементом данных с меньшими накладными расходами, чем тип Monitor. В классе Interlocked определены статические члены, часть которых описана в табл. 15.4.

Несмотря на то что это не сразу видно, процесс атомарного изменения одиночного значения довольно часто применяется в многопоточной среде. Пусть имеется код, который инкрементирует целочисленную переменную-член по имени intVal. Вместо написания кода синхронизации вроде показанного ниже:

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

int intVal = 5;

object myLockToken = new();

lock(myLockToken)

{

  intVal++;

}

код можно упростить, используя статический метод Interlocked.Increment().

Методу потребуется передать инкрементируемую переменную по ссылке. Обратите внимание, что метод Increment() не только изменяет значение входного параметра, но также возвращает полученное новое значение:

intVal = Interlocked.Increment(ref intVal);

В дополнение к методам Increment() и Decrement() тип Interlocked позволяет атомарно присваивать числовые и объектные данные. Например, чтобы присвоить переменной-члену значение 83, можно обойтись без явного оператора lock (или явной логики Monitor) и применить метод Interlock.Exchange():

Interlocked.Exchange(ref myInt, 83);

Наконец, если необходимо проверить два значения на предмет равенства и изменить элемент сравнения в безопасной к потокам манере, тогда допускается использовать метод Interlocked.CompareExchange():

public void CompareAndExchange()

{

  // Если значение i равно 83, то изменить его на 99.

  Interlocked.CompareExchange(ref i, 99, 83);

}

Программирование с использованием обратных вызовов Timer

Многие приложения нуждаются в вызове специфического метода через регулярные интервалы времени. Например, в приложении может существовать необходимость в отображении текущего времени внутри панели состояния с помощью определенной вспомогательной функции. Или, скажем, нужно, чтобы приложение эпизодически вызывало вспомогательную функцию, выполняющую некритичные фоновые задачи, такие как проверка поступления новых сообщений электронной почты. В ситуациях подобного рода можно применять тип System.Threading.Timer в сочетании со связанным делегатом по имени TimerCallback.

В целях иллюстрации предположим, что у вас есть проект консольного приложения (TimerApp), которое будет выводить текущее время каждую секунду до тех пор, пока пользователь не нажмет клавишу <Enter> для прекращения работы приложения. Первый очевидный шаг — написание метода, который будет вызываться типом Timer (не забудьте импортировать в свой файл кода пространство имен System.Threading):

using System;

using System.Threading;

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

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

Троелсен Эндрю - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки kniga-online.club.


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

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


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

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

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


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