【问题标题】:How to ensure only one user can execute a piece of code at the time如何确保只有一个用户可以同时执行一段代码
【发布时间】:2011-12-14 16:10:37
【问题描述】:

我被要求设置一个约束,即用户不能同时执行从 ASP.Net/C# Web 应用程序调用 C++ 非托管代码的部分代码。

我想问一下,在调用 PInvoke/C++ 代码的 C# 类库中的 C# 代码周围放置 lock(someobject) 是否足以确保只有一个用户能够执行代码?还是有其他技术?

我可能必须将此代码托管为 WCF 服务。这种方法也行吗?

【问题讨论】:

标签: c# asp.net .net wcf concurrency


【解决方案1】:

如果您使用 WCF,您可以采用ConcurrencyMode.Single,这将自动确保在一个上下文实例中的任何给定时刻只有一个线程在执行操作。

否则,您将需要使用手动线程同步(如锁、互斥锁等)。

【讨论】:

  • 另外,如果使用手动线程同步,您的锁/互斥锁需要为static,以便所有请求共享。否则,他们每个人都会得到自己的锁副本并愉快地并发执行。
  • 是否意味着在WCF服务上,在Per Call(上下文模式)服务上设置ConcurrencyMode.Single,多个客户端对WCF服务的调用不会同时执行?
  • @KnowledgeSeeker 你说得对,实例上下文模式必须是单一的。我更新了我的答案。
  • 如果我使用手动线程同步,我还需要确保它是单个 wcf 服务吗?或每次通话或每次会话也可以?
  • 即使是每次通话?因为这是否意味着每次我调用服务时都会创建对象并且将执行相同的代码,因为代码不会被锁定在新实例中?
【解决方案2】:

在执行代码时在变量上放置一个 lock() 是一种方法。

An article by Joe Albahari 可能会给您一些关于您系统的最佳方法的好建议。

这里还有另一个 SO 帖子:Can I add an attribute to a function to prevent reentry? 也可能对您有所帮助。

过去我使用过[MethodImpl(MethodImplOptions.NoInlining)](参见MSDN) 而且它对于同步操作非常有效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-01
    • 2023-02-11
    • 2019-10-25
    • 1970-01-01
    • 1970-01-01
    • 2021-04-18
    • 2017-04-25
    相关资源
    最近更新 更多