Monitor的替代方案.在.NET 3.5中尝试输入

本文关键字:输入 NET 方案 Monitor | 更新日期: 2023-09-27 17:53:48

我正在使用线程。定时器在我的应用程序中运行消息泵。

有时所需的工作比计时器间隔的时间要长,我需要代码被"跳过"。

我写了一个小的测试应用程序来测试,并且在我的锁定中不断遇到SynchronizationLockException:

static void Main(string[] args)
{Program t = new Program();
  System.Threading.Timer myTimer = new Timer(t.Tick,null,1000,1000);
  Thread.Sleep(10000);
  myTimer.Change(0,0);
  Console.WriteLine("Waiting on lock in main thread...");
  Monitor.Enter(t.myLock);
  Console.WriteLine("Done");
  Monitor.Exit(t.myLock);
}
public  readonly Object myLock = new Object();
public  void Tick(object state)
{
  Console.WriteLine("Acquiring lock! From thread " + Thread.CurrentThread.ManagedThreadId);
  Monitor.TryEnter(myLock);
  try
  {
    Thread.Sleep(6000);
    Console.WriteLine("Inside workload!From thread " + Thread.CurrentThread.ManagedThreadId);
  }
  finally
  {
    Console.WriteLine("Releasing lock!From thread " + Thread.CurrentThread.ManagedThreadId);
    Monitor.Exit(myLock);
  }
}

我现在记不起链接,但是我已经找到了一个建议的解决方案,通过在Callback函数的开始和结束时禁用和启用计时器来满足我的初始需求,但是由于文档声明在计时器停止后它可以仍然被调用,因为它可能已经在。net线程池中被调度了。

我错过了一些明显的东西在这里或监视器不工作,因为它应该?我使用的是。net 3.5,所以

Monitor.TryEnter (myLock hasLock)

Monitor的替代方案.在.NET 3.5中尝试输入

Monitor.TryEnter()方法返回一个布尔值,您忽略了它。当您试图退出一个从未真正输入过的锁时,就会出现此错误。

对当前代码的快速修复:

//Monitor.TryEnter(myLock);
if (! Monitor.TryEnter(myLock)) return;