Почему Monitor.Pulse() не дает эффекта?
От: rg45 СССР  
Дата: 30.11.09 19:05
Оценка:
Привет всем!

Суть проблемы в двух словах: есть два потока, первый поток ожидает сигнала посредством Monitor.Wait(), второй поток сигнализирует посредством Monitor.Pulse() или Monitor.PulseAll(), но первый поток после этого не выходит из состояния ожидания. Вот минимизированный пример, воспроизводящий проблему:
using System;
using System.Threading;

namespace WaitPulseTest
{
    class Program
    {
        static object _Lock = new object();
        static bool _NeedExit = false;

        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;
            }
        }

        static void Run()
        {
            lock (_Lock)
            {
                Console.WriteLine("Thread is started.");
                do
                {
                    Monitor.PulseAll(_Lock);
                    Thread.Sleep(100);
                } while (!_NeedExit);
                Console.WriteLine("Thread is finished.");
            }
        }
    }
}


Кто виноват и что делать?
--
Справедливость выше закона. А человечность выше справедливости.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.