Обеспечивается статическим методом Sleep(). Метод статический – это значит, что всегда производится не “усыпление”, а “САМОусыпление” выполняемого в данный момент потока. Выполнение методов текущего потока блокируется на определённые интервалы времени. Всё зависит от выбора перегруженного варианта метода. Планировщик потоков смотрит на поток и принимает решение относительно того, можно ли продолжить выполнение усыплённого потока.
В самом простом случае целочисленный параметр определяет временной интервал блокировки потока в миллисекундах.
Если значение параметра установлено в 0, поток будет остановлен до того момента, пока не будет предоставлен очередной интервал для выполнения операторов потока.
Если значение интервала задано с помощью объекта класса TimeSpan, то момент, когда может быть возобновлено выполнение потока, определяется с учётом закодированной в этом объекте информации.
// Поток заснул на 1 час, 2 минуты, 3 секунды:
Thread.Sleep(new TimeSpan(1,2,3));
:::::
// Поток заснул на 1 день, 2 часа, 3 минуты, 4 секунды, 5 милисекунд:
Thread.Sleep(new TimeSpan(1,2,3,4,5));
Значение параметра, представленное выражением
System.Threading.Timeout.Infinite
позволяет усыпить поток на неопределённое время. А разбудить поток при этом можно с помощью метода Interrupt(), который в этом случае вызывается из другого потока.
using System;
using System.Threading;
class Worker
{
int allTimes;
// Конструктор с параметрами...
public Worker(int tKey)
{
allTimes = tKey;
}
// Тело рабочей функции...
public void DoItEasy()
{//====================================
int i;
for (i = 0; i < allTimes; i++)
{
Console.Write(“{0}\r”,i);
if (i == 5000)
{
try
{
Console.WriteLine(“\nThread go to sleep!”);
Thread.Sleep(System.Threading.Timeout.Infinite);
}
catch (ThreadInterruptedException e)
{
Console.WriteLine(“{0}, {1}”,e,e.Message);
}
}
}
Console.WriteLine(“\nWorker was here!”);
}//====================================
}
class StartClass
{
static void Main(string[] args)
{
Worker w0 = new Worker(10000);
ThreadStart t0;
t0 = new ThreadStart(w0.DoItEasy);
Thread th0;
th0 = new Thread(t0);
th0.Start();
Thread.Sleep(10000);
if (th0.ThreadState.Equals(ThreadState.WaitSleepJoin)) th0.Interrupt();
Console.WriteLine(“MainThread was here...”);
}
}
И всегда надо помнить: приложение выполняется до тех пор, пока не будет выполнен последний оператор последнего потока. И не важно, выполняются ли при этом потоки, “спят”, либо просто заблокированы.