Monitor.Wait超时永远不会超时

时间:2014-05-19 00:24:39

标签: c# multithreading monitors

所以我使用Monitor.Wait进行了一个简单的测试,超时设置为3秒。我的理解是,当时间到期时,会向监视器发送虚拟脉冲以释放等待。然而,在我的测试中,似乎永远不会发生。有人可以解释一下发生了什么。这是我的测试代码:

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

        }
    }
}

1 个答案:

答案 0 :(得分:0)

如果超时到期并且无法获得锁定,

Monitor.Wait将返回false。

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

您必须检查Monitor.Wait的返回值,例如,如果您认为合适,请抛出TimeOutException