static void Run()
{
lock (_Lock)
{
do
{
Monitor.PulseAll(_Lock);
Thread.Sleep(100);
} while (!_NeedExit);
Console.WriteLine("Thread is finished.");
}
}
По тому что цикл do {} while (!_NeedExit); не завершится пока не будет установлен флаг _NeedExit и как следствие не освободит _Lock, а функция Monitor.Wait не вернет управление пока не будет освобожден _Lock. В результате имеем деадлок.
R>что делать?
Учить многопоточность, в частности паттерн монитор, рабочий код:
static void Main(string[] args)
{
lock (_Lock)
{
Thread thread = new Thread(Run);
thread.Start();
Console.WriteLine("Waiting for thread started . . .");
Monitor.Wait(_Lock);
}
Console.WriteLine("Press any key to exit . . ."); //Сюда мы не приходим
Console.ReadKey(true);
lock (_Lock)
{
_NeedExit = true;
Monitor.PulseAll(_Lock);
}
}
static void Run()
{
lock (_Lock)
{
Console.WriteLine("Thread is started.");
Monitor.PulseAll(_Lock);
do
{
Monitor.Wait(_Lock, 100);
// делаем еще чтото
} while (!_NeedExit);
Console.WriteLine("Thread is finished.");
}
}