Monitor.Wait время ожидания никогда не истекает

1

Поэтому у меня есть простой тест с использованием Monitor.Wait с тайм-аутом, установленным в течение трех секунд. Я понимаю, что, когда время истекает, виртуальный импульс отправляется на монитор, чтобы освободить ожидание. Однако в моем тесте это, похоже, никогда не произойдет. Может кто-то объяснить, что происходит. Здесь мой тестовый код:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;

namespace BlockingMethodFoo
{
    class Program
    {
        static void Main(string[] args)
        {
            WaitFoo foo = new WaitFoo();

            foo.StartMethod();

            Console.WriteLine("Done. Press enter");
            Console.ReadLine();

        }
    }

    public class WaitFoo
    {
        private object _waitObj = new object();
        private string _message = string.Empty;

        public void StartMethod()
        {
            Thread waitThread = new Thread(new ThreadStart(new Action(() => { WaitMethod(); })));

            _message = string.Empty;

            Console.WriteLine("Starting wait");

            _message = "Time Out";

            lock (_waitObj)
            {
                waitThread.Start();

                Monitor.Wait(_waitObj, TimeSpan.FromSeconds(3));
            }

            Console.WriteLine(_message);

        }

        private void WaitMethod()
        {

            lock (_waitObj)
            {
                _message = Console.ReadLine();
                Monitor.Pulse(_waitObj);
            }

        }
    }
}
Теги:
multithreading
monitors

1 ответ

0

Monitor.Wait вернет false, если истечет время ожидания, и он не смог получить блокировку.

http://msdn.microsoft.com/en-us/library/tdc87f8y.aspx

Вы должны проверить возврат Monitor.Wait и, например, выбросить TimeOutException если хотите.

  • 0
    Привет, вторторола. Я прочитал эту ссылку несколько раз, и, похоже, это подразумевает, что, да, Monitor.Wait действительно вернет false, если истечет время ожидания, прежде чем он сможет получить блокировку, но проблема, как утверждает Ганс, заключается в том, что Wait не вернуть только потому, что истекло время ожидания.
  • 0
    Понимаю. Я видел код, и эта деталь привлекла мое внимание. Я рад, что вы нашли свое решение.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню