gpt4 book ai didi

c# - NET 3.5 中 Monitor.TryEnter 的替代方案

转载 作者:行者123 更新时间:2023-11-30 13:59:04 25 4
gpt4 key购买 nike

我正在使用 Threading.Timer 在我的应用程序中运行消息泵。

有时所需的工作比计时器间隔之间的间隔更长,我需要代码然后被“跳过”。

我写了一个小测试应用程序来测试,并在锁定时一直遇到 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);
}

}

我现在不记得链接了,但是我找到了一个建议的解决方案,可以通过在回调函数的开始和结束时禁用和启用计时器来满足我的初始要求,但是由于文档指出在计时器被启用之后停止它可以仍然会被调用,因为它可能已经被安排在 .NET 线程池上。

我是不是遗漏了一些明显的东西,或者 Monitor 没有按预期工作?我在 .NET 3.5 上,所以

Monitor.TryEnter(myLock,hasLock)

不幸的是还不是一个选项。

最佳答案

Monitor.TryEnter() 方法返回一个 bool 值,您忽略了它。当您尝试退出从未真正进入的锁时,就会出现您看到的错误。

快速修复您当前的代码:

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

关于c# - NET 3.5 中 Monitor.TryEnter 的替代方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14378508/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com