Re: Почему Monitor.Pulse() не дает эффекта?
От: Finder_b  
Дата: 30.11.09 19:32
Оценка: 31 (2)
        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.");
            }
        }
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.