- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
是否可以检测是否是同一个线程试图释放锁?我们在代码中有很多地方看起来像:
thử
{
thử
{
if(!Monitor.TryEnter(obj, 2000))
{
throw new Exception("can not lock");
}
}
Cuối cùng
{
Monitor.Exit(obj);
}
}
nắm lấy
{
//Log
}
上面的代码非常简化,实际上Enter 和Exit 语句位于自定义对象(锁管理器)中。
问题是,在该结构中,我们在尝试“退出”时遇到了 SynchronizationLockException
,因为它看起来像是未成功锁定的线程,最终尝试释放。
所以问题是,我如何知道执行 Monitor.Exit 的线程是否与执行 Monitor.Enter 的线程相同?
我以为我可以使用 CurrentThread.Id 来同步进入和退出,但我不确定它是否足够“安全”。
câu trả lời hay nhất
So the question, is how I can know if the thread who making Monitor.Exit is the same thread who did Monitor.Enter?
据我所知,你不能,很容易。您无法找出哪个线程拥有监视器。
但是,这只是一个mã hóa问题 - 您应该更改您的代码,使其甚至不会thử释放不应该释放的监视器。所以你上面的代码可以重写为:
if (!Monitor.TryEnter(obj, 2000))
{
throw new Exception(...);
}
thử
{
// Presumably other code
}
Cuối cùng
{
Monitor.Exit(obj);
}
或者更好的是,如果您使用的是 .NET 4,请使用 overload of TryEnter
它接受一个 Phải
tham số:
bool gotMonitor = false;
thử
{
Monitor.TryEnter(obj, ref gotMonitor);
if (!gotMonitor)
{
throw new Exception(...);
}
// Presumably other code
}
Cuối cùng
{
if (gotMonitor)
{
Monitor.Exit(obj);
}
}
关于c# - Monitor.TryEnter/Monitor.Exit 和 SynchronizationLockException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14089640/
我刚开始使用企业库的 v5,似乎遇到了一些奇怪的问题。 像往常一样,我从日志记录开始。我刚刚添加了所需的引用并执行以下代码: Logger.Write("test"); 到目前为止没有什么特别的。检查
我有一个名为HandleMessage 的方法,启动了一个新线程来处理消息。如果成功获取锁对象,则进行处理。否则将消息放入队列。 SynchronizationLockException 总是在 Mo
这段代码有什么问题? 我总是得到一个 Object synchronization method was called from an unsynchronized block of code 异常(
我有以下代码,它基于 Monitor class example on the msdn website . private void WebRefresh_Click(object send
我正在尝试使用 SpinLock,但即使是单线程控制台应用程序中的这个最基本的代码,当我调用SpinLock.Exit() 时也会引发以下异常 System.Threading.Synchroniza
释放锁时我收到 SynchronizationLockException。 当然,我做的第一件事就是用谷歌搜索这个问题。我发现了两个主要的错误模式: 在与创建互斥锁不同的线程上释放互斥锁。 使用值类型
Unity 依赖项注入(inject)容器有一个似乎广为人知的问题,即 SynchronizedLifetimeManager 经常会导致 Monitor.Exit 方法抛出 Synchronizat
我正在使用 Monitor 类来管理关键部分。但有时我会遇到带有以下消息的 SynchronizationLockException An unhandled exception of type 'S
是否可以检测是否是同一个线程试图释放锁?我们在代码中有很多地方看起来像: try { try { if(!Monitor.TryEnter(obj, 2000))
我试图在 blazor(客户端)启动期间调用 api 以将语言翻译加载到 ILocalizer 中。 在这一点上,我尝试从 get 请求中获取 .Result blazor 在标题中引发错误。 这可以
我正在创建一段代码,从我们拥有的遗留系统中获取网页。为了避免过度查询,我缓存了获取到的URL。我正在使用 Monitor.Enter、Monitor.Exit 并仔细检查以避免发出两次请求,但是当使用
Tôi là một lập trình viên xuất sắc, rất giỏi!