Поэтому у меня есть простой тест с использованием 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);
}
}
}
}
Monitor.Wait
вернет false, если истечет время ожидания, и он не смог получить блокировку.
http://msdn.microsoft.com/en-us/library/tdc87f8y.aspx
Вы должны проверить возврат Monitor.Wait
и, например, выбросить TimeOutException
если хотите.