.NET 多线程:锁定时间过长时用日志锁定对象

2024-02-15

在系统中,我们有通过特定参数锁定对象的方法。 作为实现,我们有带有 Enter 方法的 LockManager,该方法接收锁的密钥,检查内部字典中是否存在锁对象,如果不存在,则创建它然后锁定。

我想要做的是为特定锁定设置“X 预期时间”,如果一个对象被锁定超过 X 时间,我想向我们的日志写入一条消息。

下面是我的锁管理器的源代码:

public class MyLockManager<T>
{
    protected Dictionary<T, object> LockDictionary { get; private set; }

    public MyLockManager()
    {
        LockDictionary = new Dictionary<T, object>();
    }

    /// <summary>
    /// Enters a lock on the key.
    /// </summary>
    /// <param name="key">The key to lock.</param>
    public virtual void Enter(T key)
    {
        if (!LockDictionary.ContainsKey(key))
        {
            lock (LockDictionary)
            {
                if (!LockDictionary.ContainsKey(key))
                {
                    LockDictionary.Add(key, new object());
                }
            }
        }

        object lockObj = LockDictionary[key];
        Monitor.Enter(lockObj);
    }

    /// <summary>
    /// Releases the lock on the key.
    /// </summary>
    /// <param name="key">The key to release.</param>
    public virtual void Exit(T key)
    {
        if (LockDictionary.ContainsKey(key))
        {
            Monitor.Exit(LockDictionary[key]);
        }
    }
}

现在我想添加一个额外的方法,假设特定键的对象被锁定超过 X 时间,将调用 LockTimoutHandler(T key) 。

为了做到这一点,我想向“Enter”和“Exit”方法添加一些逻辑。当 Enter 被调用时,某些东西会以某种方式被注册在 X 时间内运行 LockTimoutHandler,当调用“Exit”时,有些东西会以某种方式被取消注册.

我的问题是我可以用什么来代替某物?我如何安排该方法在 X 时间内运行,如果之前发生退出,则删除该计划。它必须非常快,因为在我们的例子中性能非常重要。我知道 Timer 对象......它可以以延迟的方式执行方法,但它的性能足够好吗?为了实现这一目标,我还需要哪些额外的选择?

NOTE: 澄清一下,我不是在谈论TryEnter。我并不是想捕获对象无法锁定特定时间的情况,我想捕获已经锁定时间过长的对象。

Thanks!


我们也有类似的需求,是这样解决的:

  • 锁定时,将计时器设置为超时,并向其传递一个状态对象,其中包含您想要的密钥和委托:日志记录、强制解锁……您的用例所需的任何内容
  • 当计时器触发时,检查密钥,如果条目存在则调用委托
  • 重要的:回收计时器(例如在线程安全队列中),执行not让它超出范围。
  • 当您下次需要计时器时,从回收队列中取出一个计时器并操作状态对象 - 仅在需要时创建一个新计时器。

这将根据需要保留尽可能多的计时器,但不会更多,并且只会产生一次分配/释放的成本。由于您无法更改计时器的状态对象,因此您需要更改其内容。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

.NET 多线程:锁定时间过长时用日志锁定对象 的相关文章

  • 计算文本框中换行的行数

    我在文本框中有一行文本 并且换行为多行 如何计算文本框中换行的行数 你可以使用String Split int lineCount txt Text Split new n r StringSplitOptions None Length
  • 在 Java 中创建 T 的新实例

    在C 中 我们可以定义一个泛型class A
  • 在 C# 中调用 C++ 库 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我有很多用 C 编写的库 我想从 C 调用这些库 但是 我遇到了很多问题 我想知道是否有书籍或指南告诉我如何做到这一点 Dll导入 htt
  • 运行需要 MySql.Data 的内置 .NET 应用程序

    我在运行我编写的内置 NET 应用程序时遇到问题 我的应用程序使用最新的 MySql 连接器 该连接器安装在我的系统上 当我尝试将其添加为引用时 该连接器显示为 NET 4 Framwork 组件 当我在环境中以调试模式运行应用程序时 一切
  • 获取 boost Spirit 语法中的当前行

    我正在尝试使用 boostspirit 获取正在解析的文件的当前行 我创建了一个语法类和结构来解析我的命令 我还想跟踪在哪一行找到命令并将其解析到我的结构中 我将 istream 文件迭代器包装在 multi pass 迭代器中 然后将其包
  • 使用查询表达式对 List 进行排序

    我在使用 Linq 订购这样的结构时遇到问题 public class Person public int ID get set public List
  • 根据对象变量搜索对象列表

    我有一个对象列表 这些对象具有三个变量 ID 名称和值 这个列表中可能有很多对象 我需要根据ID或Name找到一个对象 并更改值 例子 class objec public string Name public int UID public
  • C#6 中的长字符串插值行

    我发现 虽然字符串插值在应用于现有代码库的字符串 Format 调用时非常好 但考虑到通常首选的列限制 字符串对于单行来说很快就会变得太长 特别是当被插值的表达式很复杂时 使用格式字符串 您将获得一个可以拆分为多行的变量列表 var str
  • 使用具有抗锯齿功能的 C# 更改抗锯齿图像的背景颜色

    我有一个图像需要更改背景颜色 例如 将下面示例图像的背景更改为蓝色 然而 图像是抗锯齿的 所以我不能简单地用不同的颜色替换背景颜色 我尝试过的一种方法是创建第二个图像 仅作为背景 并更改其颜色并将两个图像合并为一个图像 但是这不起作用 因为
  • 为什么 Cdecl 调用在“标准”P/Invoke 约定中经常不匹配?

    我正在开发一个相当大的代码库 其中 C 功能是从 C P Invoked 的 我们的代码库中有很多调用 例如 C extern C int stdcall InvokedFunction int 使用相应的 C DllImport CPlu
  • Project Euler #8,我不明白我哪里出了问题[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我正在做项目欧拉第八题 https projecteuler net problem 8 其中我得到了这个大得离谱的数字 7316
  • 如何从 Rx Subscribe 回调异步函数?

    我想回调 Rx 订阅中的异步函数 例如 像那样 public class Consumer private readonly Service service new Service public ReplaySubject
  • 英文日期差异

    接近重复 如何计算相对时间 https stackoverflow com questions 11 how do i calculate relative time 如何在 C 中计算某人的年龄 https stackoverflow c
  • Linux mremap 不释放旧映射?

    我需要一种方法将页面从一个虚拟地址范围复制到另一个虚拟地址范围 而无需实际复制数据 范围很大 延迟很重要 mremap 可以做到这一点 但问题是它也会删除旧的映射 由于我需要在多线程环境中执行此操作 因此我需要旧映射能够同时使用 因此稍后当
  • ASP.NET MVC 路由:如何从 URL 中省略“索引”

    我有一个名为 StuffController 的控制器 具有无参数索引操作 我希望从表单中的 URL 调用此操作mysite com stuff 我的控制器定义为 public class StuffController BaseContr
  • CUDA 8 编译错误 -std=gnu++11

    我正在尝试转换一些代码以使用 CUDA 并且我认为我遇到了兼容性问题 我们使用CMake 这些是我使用的 gcc 和 CUDA 版本 gcc version gcc Ubuntu 5 4 0 6ubuntu1 16 04 5 5 4 0 2
  • 在 C#.NET 中安全删除文件

    在我正在做的一个项目中 我想为用户提供 安全 删除文件的选项 例如 用随机位或 0 覆盖它 在 C NET 中是否有一种简单的方法可以做到这一点 效果如何 你可以调用系统内部删除 http technet microsoft com en
  • 在 .NET 中,多次调用 string.Replace() 是否比单次调用 Regex 方法效率低?

    我想替换字符串中大约 8 个字符 使用 Regex 方法或仅使用对 string Replace 的多次调用会更有效吗 我将替换可能出现的大约 7 个字符 全部替换为下划线 字符可以出现在字符串中的任何位置 并且不按特定顺序等 除非您确实需
  • 为什么以下 C 程序会出现总线错误?

    我认为这是第一个失败的 strtok 调用 好久没写C了 有点不知所措 非常感谢 include
  • 为什么匹配模板类上的部分类模板特化与没有模板匹配的另一个部分特化不明确?

    这个问题可能很难用标题中的句子来描述 但这里有一个最小的例子 include

随机推荐

  • 为 iPhone 应用程序创建的本地数据库保存在哪里?

    我开发了一个加载完全静态内容的应用程序 我存储的数据大小超过 4 MB 如果没有此内容 应用程序将无法运行 在我的情况下 我应该在哪里保存本地数据库 文档文件夹或库文件夹 我的应用程序因 iCloud 存储备份而被拒绝 1 我应该在哪里保存
  • NoMethodError:Rails 中 nil:NilClass 未定义方法“类型”

    尝试加载使用 Rails 构建的网站上的某一页面时出现 NoMethodError 请参阅下面的完整堆栈跟踪 如果我改变false to true生产中 rb 在线 config cache classes false 然后问题就消失了 但
  • 凯尔·辛普森 (Kyle Simpson) 的 OLOO 模式与原型设计模式

    Kyle Simpson 的 OLOO 对象链接到其他对象 模式 与原型设计模式有什么不同吗 除了用专门表示 链接 原型的行为 的东西来创造它并澄清这里没有发生 复制 类的行为 之外 他的模式到底引入了什么 Here s 凯尔模式的示例 h
  • 为什么更改我的框的innerHTML 会使我的按钮在Greasemonkey 中停止工作?

    因此 我编写了一个脚本 在新选项卡中一次加载一个图像 感谢 Brock 让停止按钮可以工作HERE https stackoverflow com a 26418958 996364 然后我打破了它 添加了我在等待该问题的答案时写入的计数器
  • RESTful 身份验证作为一种状态形式

    Its 不可能的无需状态即可进行身份验证 那么 在设计带有身份验证的 RESTful 软件时 我们是否会为了安全性而牺牲这种架构呢 这能走多远 你可以存储任意数量的状态 只要它是为了构建更安全的系统吗 表示状态转移或 REST http e
  • Select2 - 如何插入粗体标题?

    我查看了 select2 的所有文档 但找不到如何插入这些粗体标题 有人可以提供一个完整的代码示例 需要 CSS 吗 来说明如何实现这一点 您可以通过使用来实现这一点optgroup tag
  • 仅在页面加载时处理 f:viewParam

    我正在使用一个
  • Mongoose / MongoDB - 使用预定义的模式附加到文档对象数组的简单示例

    为了简单起见 假设这些是我的集合模式 var MessageDeliverySchema new Schema from type String to type String status type String var Messages
  • 为什么 chrome 不运行这个 javascript

    当我在 Chrome 版本 2 中运行它时 它不会返回字符串 但它可以在 Firefox 版本 3 中运行 为什么是这样
  • Android - 集成 ffmpeg 和 android-ndk-r9c

    我看过很多关于 FFmpeg 以及在 Android 中使用 FFmpeg 的帖子 但我发现这些帖子大多数都是针对旧版本的 FFmpeg 或 Android NDK 我能够得到结果https github com mconf android
  • 使用 jquery 将内容包装在 div 中

    我试图将内容包装在 div 中 但问题是 html 页面不可编辑 所以我尝试其他方法 使用 jQuery 将所有内容包装在 adiv以下是html结构 document ready function hr before div class
  • 我可以在 oncreate 方法之外使用 setContentView 吗?

    我看到很多人告诉你可以在 oncreate 方法之外设置 setContentView 但我没有在任何地方找到示例 现在 当我尝试使用 setContentView 时 我的应用程序崩溃了 这是我的源代码 AlarmActivity jav
  • 如何在 Django 中使用带有 https 的登录重定向?

    我正在使用 django braces LoginRequiredMixin对于我的观点之一 基本上 这会添加一个查询字符串 next my desired url to http example com login 问题是 我在我的网站上
  • 将准备好的语句的结果存储为mysql中的表?

    是否可以将准备好的表的结果存储在mysql中 我的用例是 我根据源表的某些条件创建两个变量 然后根据此条件获取随机行 由于我有 10 个这样的表 我是否应该第一个加入它们 然后根据 总体 传递 过滤标准进行随机化 另请参阅下面的 total
  • 使用 Python 进行迭代时出现 StaleElementException

    我正在尝试为亚马逊结果创建一个基本的网络抓取工具 当我迭代结果时 有时会到达结果的第 5 页 有时仅第 2 页 然后是StaleElementException被抛出 当我在抛出异常后查看浏览器时 我可以看到驱动程序 页面没有向下滚动到页码
  • Xcode 4 中没有外部库的符号/源

    我的应用程序没有看到库的源代码 如果我在库方法上 跳转到定义 XCode 会将我带到 h 文件 但说没有 cpp 对应项 When debugging I see no source code and most of the call st
  • 在 NetLogo 中控制海龟的生命

    在一个项目中 我正在 NetLogo 中开发一个模拟来处理狗和人类的狂犬病 我有一些乌龟 人类和狗 可以接种疫苗 也可以不接种 一开始我创造了一只患有狂犬病的狗 根据疾病的阶段 1或2 它有一定的概率将疾病传播给其他狗 最后 狗可能会因瘫痪
  • 如何在android中使用可见和不可见的按钮

    我想让一个按钮不可见 当我单击另一个按钮时 不可见的按钮将变得可见 然后执行onClick 对可见按钮执行的操作 What onClick 我可以在可见按钮上使用的操作 我使用了如下所示的方法 donebutton Button findV
  • Javascript sort() 不能正确按字母顺序排列

    var ccArray ccArray input checkbox name multiselect ddlCC sort 我可以说我得到了数组中所需的值 但是在 sort 运行之后 数组顺序发生了变化 但不是按字母顺序排列 我得到诸如
  • .NET 多线程:锁定时间过长时用日志锁定对象

    在系统中 我们有通过特定参数锁定对象的方法 作为实现 我们有带有 Enter 方法的 LockManager 该方法接收锁的密钥 检查内部字典中是否存在锁对象 如果不存在 则创建它然后锁定 我想要做的是为特定锁定设置 X 预期时间 如果一个