Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю
Console.WriteLine("***** Working with Timer type *****n");
Console.ReadLine();
static void PrintTime(object state)
{
Console.WriteLine("Time is: {0}",
DateTime.Now.ToLongTimeString());
}
Обратите внимание, что метод
PrintTime()
System.Object
void
TimerCallback
TimerCallback
System.Object
System.Array
Следующий шаг связан с конфигурированием экземпляра делегата
TimerCallback
Timer
TimerCallback
Timer
System.Object
Console.WriteLine("***** Working with Timer type *****n");
// Создать делегат для типа Timer.
TimerCallback timeCB = new TimerCallback(PrintTime);
// Установить параметры таймера.
Timer t = new Timer(
timeCB, // Объект делегата TimerCallback.
null, // Информация для передачи в вызванный метод.
// (null, если информация отсутствует).
0, // Период ожидания перед запуском (в миллисекундах).
1000); // Интервал между вызовами (в миллисекундах).
Console.WriteLine("Hit Enter key to terminate...");
Console.ReadLine();
В этом случае метод
PrintTime()
***** Working with Timer type *****
Hit key to terminate...
Time is: 6:51:48 PM
Time is: 6:51:49 PM
Time is: 6:51:50 PM
Time is: 6:51:51 PM
Time is: 6:51:52 PM
Press any key to continue ...
Чтобы передать целевому методу делегата какую-то информацию, необходимо просто заменить значение
null
// Установить параметры таймера.
Timer t = new Timer(timeCB, "Hello From C# 9.0", 0, 1000);
You can then obtain the incoming data as follows:static void PrintTime(object state)
{
Console.WriteLine("Time is: {0}, Param is: {1}",
DateTime.Now.ToLongTimeString(), state.ToString());
}
Использование автономного отбрасывания (нововведение в версии 7.0)
В предыдущем примере переменная
Timer
var _ = new Timer(
timeCB, // Объект делегата TimerCallback.
null, // Информация для передачи в вызванный метод
// (null, если информация отсутствует).
0, // Период ожидания перед запуском
// (в миллисекундах).
1000); // Интервал между вызовами
// (в миллисекундах).
Класс ThreadPool
Следующей темой о потоках, которую мы рассмотрим в настоящей главе, будет роль пула потоков. Запуск нового потока связан с затратами, поэтому в целях повышения эффективности пул потоков удерживает созданные (но неактивные) потоки до тех пор, пока они не понадобятся. Для взаимодействия с этим пулом ожидающих потоков в пространстве имен
System.Threading
ThreadPool
Чтобы запросить поток из пула для обработки вызова метода, можно использовать метод
ThreadPool.QueueUserWorkItem()
WaitCallback
System.Object
public static class ThreadPool
{
...
public static bool QueueUserWorkItem(WaitCallback callBack);
public static bool QueueUserWorkItem(WaitCallback callBack,
object state);
}
Делегат
WaitCallback
System.Object
QueueUserWorkItem()
System.Object
null
ThreadPoolApp
Printer
Thread
PrintNumbers()