Язык программирования C#9 и платформа .NET5 - Джепикс Филипп - Страница 286
- Предыдущая
- 286/642
- Следующая
// Вывести числа. 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); }}Первым делом обратите внимание, что конечным получателем маркера потока, который указывается как аргумент ключевого слова
lockMonitor. Enter()locktryfinallyMonitor.Exit()MultiThreadShareDataMonitorС учетом того, что ключевое слово
lockSystem.Threading.MonitorMonitorMonitorMonitor.Wait()Monitor.Pulse()Monitor.PulseAll()Как и можно было ожидать, в значительном числе случаев ключевого слова
lockMonitorСинхронизация с использованием типа System.Threading.Interlocked
Не заглядывая в код CIL, обычно нелегко поверить в то, что присваивание и простые арифметические операции не являются атомарными. По указанной причине в пространстве имен
System.ThreadingMonitorInterlocked
Несмотря на то что это не сразу видно, процесс атомарного изменения одиночного значения довольно часто применяется в многопоточной среде. Пусть имеется код, который инкрементирует целочисленную переменную-член по имени
intValint intVal = 5;object myLockToken = new();lock(myLockToken){ intVal++;}код можно упростить, используя статический метод
Interlocked.Increment()Методу потребуется передать инкрементируемую переменную по ссылке. Обратите внимание, что метод
Increment()intVal = Interlocked.Increment(ref intVal);В дополнение к методам
Increment()Decrement()Interlocked83lockMonitorInterlock.Exchange()Interlocked.Exchange(ref myInt, 83);Наконец, если необходимо проверить два значения на предмет равенства и изменить элемент сравнения в безопасной к потокам манере, тогда допускается использовать метод
Interlocked.CompareExchange()public void CompareAndExchange(){ // Если значение i равно 83, то изменить его на 99. Interlocked.CompareExchange(ref i, 99, 83);}Программирование с использованием обратных вызовов Timer
Многие приложения нуждаются в вызове специфического метода через регулярные интервалы времени. Например, в приложении может существовать необходимость в отображении текущего времени внутри панели состояния с помощью определенной вспомогательной функции. Или, скажем, нужно, чтобы приложение эпизодически вызывало вспомогательную функцию, выполняющую некритичные фоновые задачи, такие как проверка поступления новых сообщений электронной почты. В ситуациях подобного рода можно применять тип
System.Threading.TimerTimerCallbackВ целях иллюстрации предположим, что у вас есть проект консольного приложения (
TimerAppTimerSystem.Threadingusing System;using System.Threading;- Предыдущая
- 286/642
- Следующая
