.Net 中的钥匙锁

2024-02-07

我有一个 Azure 服务总线队列,我正在其中接收 1 到 10 条具有相同“密钥”的消息。其中一条消息需要通过长时间运行的操作来处理。完成后,数据库将被更新,其他消息将对其进行检查。但是,与此同时,其他消息将重新排队,以便进程不会丢失。

但要点是这个长时间运行的操作CANNOT对于同一个密钥同时运行,并且不应运行多次。

这是我到目前为止所得到的:

void Main()
{
    Enumerable.Range(1, 1000)
              .AsParallel()
              .ForAll(async i => await ManageConcurrency(i % 2, async () => await Task.Delay(TimeSpan.FromSeconds(10)))); 
}

private readonly ConcurrentDictionary<int, SemaphoreSlim> _taskLocks = new ConcurrentDictionary<int, SemaphoreSlim>();

private async Task<bool> ManageConcurrency(int taskId, Func<Task> task)
{
    SemaphoreSlim taskLock = null;

    try
    {
        if (_taskLocks.TryGetValue(taskId, out taskLock))
        {
            if (taskLock.CurrentCount == 0)
            {
                Console.WriteLine($"{DateTime.Now.ToString("hh:mm:ss.ffffff")},  {taskId}, I found. No available.. Thread Id: {Thread.CurrentThread.ManagedThreadId}");
                return false;
            }

            taskLock.Wait();

            Console.WriteLine($"{DateTime.Now.ToString("hh:mm:ss.ffffff")},  {taskId}, I found and took. Thread Id: {System.Threading.Thread.CurrentThread.ManagedThreadId}");
        }
        else
        {
            taskLock = new SemaphoreSlim(1, 1);
            taskLock = _taskLocks.GetOrAdd(taskId, taskLock);
            if (taskLock.CurrentCount == 0)
            {
                Console.WriteLine($"{DateTime.Now.ToString("hh:mm:ss.ffffff")},  {taskId}, I didn't find, and then found/created. None available.. Thread Id: {System.Threading.Thread.CurrentThread.ManagedThreadId}");
                return false;
            }
            else
            {
                taskLock.Wait(TimeSpan.FromSeconds(1));

                Console.WriteLine($"{DateTime.Now.ToString("hh:mm:ss.ffffff")},  {taskId}, I didn't find, then found/created, and took. Thread Id: {System.Threading.Thread.CurrentThread.ManagedThreadId}");
            }
        }

        Console.WriteLine($"{DateTime.Now.ToString("hh:mm:ss.ffffff")},  {taskId}, Lock pulled for TaskId {taskId}, Thread Id: {System.Threading.Thread.CurrentThread.ManagedThreadId}");

        await task.Invoke();

        return true;
    }
    catch (Exception e)
    {
        ;
        return false;
    }
    finally
    {
        //taskLock?.Release();

        _taskLocks.TryRemove(taskId, out taskLock);

        //Console.WriteLine($"I removed. Thread Id: {System.Threading.Thread.CurrentThread.ManagedThreadId}");
    }
}

它没有按预期工作,因为它会创建多个信号量,突然我的长时间运行操作使用相同的密钥运行两次。我认为问题在于整个操作不是原子的。

解决这个问题的最佳方法是什么?


您正确地认识到您需要确保每个键仅创建一个信号量。标准的习惯用法是:

var dict = new ConcurrentDictionary<TKey, Lazy<SemaphoreSlim>>();
...
var sem = dict.GetOrAdd( , _ => new new Lazy<SemaphoreSlim>(() => SemaphoreSlim(1, 1))).Value;

可能会创建多个懒惰,但只有其中一个会被揭示和具体化。

除此之外,依赖内存状态是一种值得怀疑的做法。如果您的队列处理应用程序回收并且所有信号量都丢失怎么办?您最好使用持久存储来跟踪此锁定信息。

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

.Net 中的钥匙锁 的相关文章

  • 使用实体框架从集合中删除项目

    我正在使用DDD 我有一个 Product 类 它是一个聚合根 public class Product IAggregateRoot public virtual ICollection
  • 在 C++11 中省略返回类型

    我最近发现自己在 C 11 模式下的 gcc 4 5 中使用了以下宏 define RETURN x gt decltype x return x 并编写这样的函数 template
  • std::map 和二叉搜索树

    我读过 std map 是使用二叉搜索树数据结构实现的 BST 是一种顺序数据结构 类似于数组中的元素 它将元素存储在 BST 节点中并按其顺序维护元素 例如如果元素小于节点 则将其存储在节点的左侧 如果元素大于节点 则将其存储在节点的右侧
  • Azure 服务总线主题请求与消息

    I need help interpreting these graphs 它有 0 订阅 这是否意味着该主题没有任何内容 查看消息图表 在过去 30 天内 没有收到或读取来自此主题的消息 如果没有向该主题写入 读取任何内容 为什么会有 3
  • TextBox 焦点的 WinForms 事件?

    我想添加一个偶数TextBox当它有焦点时 我知道我可以用一个简单的方法来做到这一点textbox1 Focus并检查布尔值 但我不想那样做 我想这样做 this tGID Focus new System EventHandler thi
  • ZLIB 解压缩

    我编写了一个小型应用程序 该应用程序应该解压缩以 gzip deflate 格式编码的数据 为了实现这一点 我使用 ZLIB 库 使用解压缩功能 问题是这个功能不起作用 换句话说 数据不是未压缩的 我在这里发布代码 int decompre
  • 为什么密码错误会导致“填充无效且无法删除”?

    我需要一些简单的字符串加密 所以我编写了以下代码 有很多 灵感 来自here http www codeproject com KB security DotNetCrypto aspx create and initialize a cr
  • C++11 函数局部静态 const 对象的线程安全初始化

    这个问题已在 C 98 上下文中提出 并在该上下文中得到回答 但没有明确说明有关 C 11 的内容 const some type create const thingy lock my lock some mutex static con
  • C# 编译器如何决定发出可重定向的程序集引用?

    NET Compact Framework 引入了可重定向程序集引用 现在用于支持可移植类库 基本上 编译器会发出以下 MSIL assembly extern retargetable mscorlib publickeytoken 7C
  • UWP 无法在两个应用程序之间创建本地主机连接

    我正在尝试在两个 UWP 应用程序之间设置 TCP 连接 当服务器和客户端在同一个应用程序中运行时 它可以正常工作 但是 当我将服务器部分移动到一个应用程序并将客户端部分移动到另一个应用程序时 ConnectAsync 会引发异常 服务器未
  • C# 搜索目录中包含字符串的所有文件,然后返回该字符串

    使用用户在文本框中输入的内容 我想搜索目录中的哪个文件包含该文本 然后我想解析出信息 但我似乎找不到该字符串或至少返回信息 任何帮助将不胜感激 我当前的代码 private void btnSearchSerial Click object
  • 过期时自动重新填充缓存

    我当前缓存方法调用的结果 缓存代码遵循标准模式 如果存在 则使用缓存中的项目 否则计算结果 在返回之前将其缓存以供将来调用 我想保护客户端代码免受缓存未命中的影响 例如 当项目过期时 我正在考虑生成一个线程来等待缓存对象的生命周期 然后运行
  • 如何检测 C# 中该字典键是否存在?

    我正在使用 Exchange Web 服务托管 API 和联系人数据 我有以下代码 即功能性的 但并不理想 foreach Contact c in contactList string openItemUrl https service
  • 为什么我使用google'smtp'无法发送电子邮件?

    我有以下程序使用 smtp gmail com 587 发送电子邮件 namespace TestMailServer class Program static void Main string args MailMessage mail
  • 过度使用委托对性能来说是一个坏主意吗? [复制]

    这个问题在这里已经有答案了 考虑以下代码 if IsDebuggingEnabled instance Log GetDetailedDebugInfo GetDetailedDebugInfo 可能是一个昂贵的方法 因此我们只想在调试模式
  • 为什么 Ajax.BeginForm 在 Chrome 中不起作用?

    我正在使用 c NET MVC2 并尝试创建一个 ajax 表单来调用删除数据库记录 RemoveRelation 的方法 删除记录的过程正在按预期进行 删除记录后 表单应调用一个 JavaScript 函数 从视觉效果中删除该记录 Rem
  • Azure 管理 API 返回 500 内部服务器错误

    我通过此请求从 Azure REST 管理 API 返回 500 内部服务器错误 为什么 X509Certificate cert X509Certificate2 CreateFromCertFile cert path string u
  • Swagger 为 ASP.CORE 3 中的字典生成错误的 URL

    当从查询字符串中提取的模型将字典作为其属性之一时 Swagger 会生成不正确的 URL 如何告诉 Swagger 更改 URL 中字典的格式或手动定义输入参数模式而不自动生成 尝试使用 Swashbuckle 和 NSwag 控制器 pu
  • Azure函数版本2.0-应用程序blobTrigger不工作

    我有一个工作功能应用程序 它有一个 blob 输入和一个事件中心输出 在测试版中工作 随着最新的更改 我的功能不再起作用 我尝试根据发行说明更新 host json 文件 但它没有引用 blob 触发器 version 2 0 extens
  • 如何确定母版页中正在显示哪个子页?

    我正在母版页上编写代码 我需要知道正在显示哪个子 内容 页面 我怎样才能以编程方式做到这一点 我用这个 string pageName this ContentPlaceHolder1 Page GetType FullName 它以 AS

随机推荐

  • XMPP 使用哪个端口?

    我搜索过但没有找到 XMPP 使用哪些端口 我需要实现XMPP服务器和客户端并使用XML传输 文件传输和流媒体 他们使用不同的端口吗 有没有办法让它们都一样使用 这样我就不需要打扰网络管理员 谢谢 根据维基百科 http en wikipe
  • 意外标记:LIMIT

    当我将上述依赖项与 NamedQuery 一起使用时 我在错误部分收到错误提示 注意 请指教 是jar问题还是JBOSS问题 我在 Jboss 7 版本中使用 jdk1 7 运行此代码 使用 EntityManager 使用命名查询 Que
  • 编写优秀的 Twisted 网络资源

    我编写了第一个 Twisted 10 1 0 网络Resource我正在寻求反馈 因为我觉得这并不完全遵循最佳实践 并且可能包含新手错误 资源响应 url http www foo baz abc123并依赖于返回的服务dict 如果出现任
  • “尝试设置非属性列表对象......”带有自定义类的 NSMutableDictionary [重复]

    这个问题在这里已经有答案了 我有一个名为的自定义类ServerModule这是一个子类NSObject 我基本上存储了所有这些ServerModules 中包含一个键值对NSMutableDictionary 然后字典存储在NSUserDe
  • 主体参数不能与表单参数一起使用 - 具有 Headers 和 json 数据的 Feign 客户端

    我有一个像这样的 FeignClient RequestLine POST enroll Headers header1 header1 header2 header2 Content Type application json Respo
  • 还有什么更好的方法来解决 Python 中的“静态变量”呢?

    似乎在Python中 要在类中声明变量 它是静态的 在下一个实例中保留其值 有什么更好的方法来解决这个问题 class Foo number 0 def set self self number 1 gt gt gt foo Foo gt
  • Keras 2,TypeError:无法pickle _thread.lock对象

    我正在使用 Keras 创建一个 ANN 并在网络上进行网格搜索 我在运行以下代码时遇到以下错误 model KerasClassifier build fn create model input dim verbose 0 define
  • 如何在与当前片段相同的空间中加载新片段

    我正在寻找一些关于处理启动其他片段的片段的最佳方法的建议 我正在转换一个应用程序 我开始使用更多基于活动的方法编写该应用程序 并开始将其转移到使用片段 我有一些用于启动新活动的片段 我想将它们移至当前片段所在的同一视图中启动其他片段 例如
  • 在地图列的 Spark 数据框中如何使用所有键的常量更新值

    我有 Spark 数据框 其中包含 Integer 和 Map 类型的两列 我想知道更新映射列的所有键的值的最佳方法 在 UDF 的帮助下 我能够更新值 def modifyValues map data Map String Int gt
  • 用 Java 调高/调低计算机音量?

    我想用一个命令来调高或调低计算机的主音量 100 0 我看到我可以使用FloatControl 但我不知道如何使用它 看看看看使用JavaSound控制主音量 http www coderanch com t 492931 java jav
  • 使用 GTM 在一个容器中实施两个 Analytics 属性

    我想在两个包含相同网站 cms 代码但内容语言不同的域上实施 Google 跟踪代码管理器 因此 我想使用一个容器 一个 GTM 代码 其中包含两个标签 一个标签包含domainA com 的UA 代码段 另一个标签包含domainB co
  • 需要 Postgres 触发器和函数方面的帮助

    我有一个查找表 其中包含一列来源 来自通过我创建的 Web 服务 API 捕获的各种硬编码活动 以及应与其关联的各个品牌 这样我就可以为品牌为空的记录赋予品牌 以便可以通过营销自动化工具使用特定模板来欢迎它们 我最终会弃用这个 API 并用
  • 学说 2 - 查询生成器条件查询... If 语句?

    我的查询是 doctirne 2 我在用户中有一个状态字段 私人或 民众 我希望能够运行此查询并显示所有评论 其中 仅当 userid 当前登录时 状态 公共和私有 用户 ID 我知道 loggerUserVarID q this gt e
  • 如何在 Azure ML 服务中注册本地训练的机器学习模型?

    我正在尝试Azure 机器学习服务 https azure microsoft com en us services machine learning service 用于机器学习部署 我已经在计算 VM 上训练了一个模型并将其保存为 pi
  • c++ - 如何使用裸新初始化智能点?

    我正在尝试学习新的 C 标准 但在使用智能指针时我遇到了不足 这是我正在编写的一个不想运行的程序的代码 include
  • Julia 并行编程 - 使现有功能可供所有工作人员使用

    我面临以下问题 我有一个函数叫做火车模型在单个线程上运行很长时间 当它完成计算时 它返回一个函数作为输出参数 我们称之为f 当我询问这个 的类型时f 朱莉娅返回 具有 1 种方法的通用函数 我不确定最后一条信息对阅读本文的人是否有用 现在在
  • Excel biff5 到 biff8 转换

    我的系统使用 Apache POI 来管理一些 xls 文件 现在我有近 300 个 xls 文件 但它们似乎是旧格式 所以我得到了这个异常 提供的电子表格似乎是 Excel 5 0 7 0 BIFF5 格式 POI 仅支持 BIFF8 格
  • 遇到错误:java.lang.NoClassDefFoundError:com/google/common/collect/ImmutableList$Builder

    我是使用 EclipseIDE 和 TestNG 来使用 Selenium WebDriver 的新手 我目前正在 Eclipse 中通过 TestNG 运行此示例代码 import org openqa selenium By impor
  • 如何将 jQuery.serialize() 数据转换为 JSON 对象?

    当表单包含多个输入数组字段时 是否有更好的解决方案来转换已通过 jQuery 函数 serialize 序列化的表单数据 我希望能够将表单数据转换为 JSON 对象 以重新创建一些其他信息表 那么告诉我一个更好的方法来将序列化字符串转换为
  • .Net 中的钥匙锁

    我有一个 Azure 服务总线队列 我正在其中接收 1 到 10 条具有相同 密钥 的消息 其中一条消息需要通过长时间运行的操作来处理 完成后 数据库将被更新 其他消息将对其进行检查 但是 与此同时 其他消息将重新排队 以便进程不会丢失 但