【问题标题】:How to make a method accessible to one user at a time in c#如何在 C# 中一次让一个用户访问一个方法
【发布时间】:2014-07-01 02:13:09
【问题描述】:

我有一种方法,我希望一次只有一个用户可以访问。我真的不知道该怎么做。

public static int add(int a, int b)
{
 int c = a+b;
 return c;
}

当用户在两个文本框中输入数据并单击 asp.net 网页上的提交按钮时,我正在调用此方法。 我不希望其他用户访问被拒绝。它们应该保存在某种队列中,当方法完成为一个用户提供服务时,应该为下一个用户提供服务。

【问题讨论】:

  • 你的意思是它必须是线程安全的吗?使用您拥有的一种 .NET 同步机制,例如锁(但我们不能从这样的虚构示例中说,为什么必须这样做?您访问共享资源还是静态变量?)
  • 在此上下文中定义“一个用户”...因为 ASP.NET 可能跨越多个应用程序域(在回收期间)或多台机器(服务器场) - 这需要有多严格是?同一用户可以向该方法发出多个并发 http 请求吗?这里的“用户”真的意味着“请求”吗?那么重入电话呢? 我们试图通过限制访问来保护什么?(这是问题的重要背景;没有必要对所示方法做任何事情,因为没有共享状态)
  • @Adriano 是的,我正在使用共享资源,一次可以为一个用户提供服务
  • @user3202862 试图获取锁的线程将被阻塞,直到当前拥有它的线程释放锁为止(或者更准确地说:它将被阻塞,直到它可以成功获取锁,如果还有其他竞争线程)
  • @user3202862 通常,您只需让锁完成它的工作...

标签: c# asp.net singleton msmq


【解决方案1】:

Msdn 得到了很好的解释,检查文档。 Thread Synchronization

由于你有一个静态方法,你需要静态Object 来锁定。

public class Calculator
{
    private static System.Object lockThis = new System.Object();

    public static void Add(int a, int b)
    {   
        lock (lockThis)
        {
            return a+b;
        }
    }

}

lock 的意思是,每当一个线程访问该方法并且它没有被锁定时,它将锁定它并运行代码。如果它被锁定,它将在解锁之前什么都不做。

编辑: 为您的方法编辑了代码。

【讨论】:

  • 如果另一个用户同时发送请求会发生什么
  • @user3202862 什么都没有,因为第一个线程锁定了该方法,这意味着其他线程将无法访问该方法。
  • 如何存储其他用户数据,然后在空闲时将该数据发送到此方法
  • @user3202862 其他请求将“阻塞”,直到锁内的请求完成,您不需要保存任何内容,因为其他请求最终会自行处理(假设您的当然,锁内的代码不会挂起)
  • 非常感谢您解释过程
【解决方案2】:

您将需要一个静态对象,并使用关键字 lock。

private static object locker = new object();
public static int add(int a, int b)
{
     lock(locker) 
     {
         //do stuff
     }
}

【讨论】:

    【解决方案3】:

    假设这个方法在一个单例对象中,你需要synchronize the method

    【讨论】:

    • 由于是static方法,所以不能说它在any对象中,单例或其他
    猜你喜欢
    • 2013-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-04
    • 1970-01-01
    相关资源
    最近更新 更多