Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю
// Вывести числа.
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
Синхронизация с использованием типа System.Threading.Interlocked
Не заглядывая в код CIL, обычно нелегко поверить в то, что присваивание и простые арифметические операции не являются атомарными. По указанной причине в пространстве имен
System.Threading
Monitor
Interlocked

Несмотря на то что это не сразу видно, процесс атомарного изменения одиночного значения довольно часто применяется в многопоточной среде. Пусть имеется код, который инкрементирует целочисленную переменную-член по имени
intVal
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
Timer
System.Threading
using System;
using System.Threading;