ASP.NET竞争条件

ASP.NET竞争条件,asp.net,locking,race-condition,Asp.net,Locking,Race Condition,防止两个不同的人同时执行同一方法的最佳方法是什么?例如,用户A和用户B位于同一页面上。两个用户都在执行该事件代码的同一时间按下页面上的按钮。我试着让一个等待另一个完成 有没有一个共同的方法来做这件事 这里有更多的信息 这是一个简单的游戏,你可以购买网站的成员(比如FB上的自有游戏)。querystring是用户的ID。我遇到一个问题,两个人同时点击购买。一个得到了用户,另一个只是赔钱。因此,我试图阻止在同一时间购买,以防止这种情况发生。您可以使用以下属性来装饰它: [MethodImpl(Met

防止两个不同的人同时执行同一方法的最佳方法是什么?例如,用户A和用户B位于同一页面上。两个用户都在执行该事件代码的同一时间按下页面上的按钮。我试着让一个等待另一个完成

有没有一个共同的方法来做这件事

这里有更多的信息


这是一个简单的游戏,你可以购买网站的成员(比如FB上的自有游戏)。querystring是用户的ID。我遇到一个问题,两个人同时点击购买。一个得到了用户,另一个只是赔钱。因此,我试图阻止在同一时间购买,以防止这种情况发生。

您可以使用以下属性来装饰它:

[MethodImpl(MethodImplOptions.Synchronized)]
public static void SomeMethod()
{
    ...
}
这样,只有一个线程可以执行该方法,其他线程将等待。这相当于将
放入整个方法体。

将为每个请求创建一个实例,因此假设您拥有的逻辑位于实例成员中,并且不访问共享的任何内容,则不需要锁定

如果访问共享资源,有几种方法可以强制锁定。一种方法是使用语句,例如

private static someObject = new Object();

public void SomeMethod() 
{
    lock(someObject) 
    {
        // do something with your shared resource.
    }

}
一般来说,您应该尽可能避免使用锁(尽管在许多情况下需要锁)

编辑:


如果您将数据保存在支持事务的数据源中(例如数据库),则首先需要检查用户试图购买的内容在用户单击页面上的“是”和您的应用程序收到响应之间是否尚未购买。因此,您需要检查数据源,查看它是否尚未购买,如果尚未购买,则为用户“购买”该项目。这应该在事务内部完成,以便它是原子的,因此,只有在“购买”项目的操作成功时,您才可以从用户帐户中取款。

您可以对静态变量使用
锁定
,但这听起来像是在为应用程序创建争用点。如果页面上有100个用户呢?我们能知道这个方法和它在做什么吗?通常,对服务的每个请求(理想情况下是RESTful)都是一个独立处理的原子单元。它通常不依赖于其他请求,尤其是在其他用户上下文中发出的请求。很可能有更好的方法来构建此属性。如果使用此方法,请注意创建死锁。根据Jeffrey Richter及其著作《通过C#实现CLR》第三版,建议不要使用此属性。此属性使用
变量上的监视器锁,这是不推荐的。相反,建议创建一个要锁定的私有实例字段。如果是静态方法,则该属性使用Monitor类锁定对类型的type对象的引用,这也是不推荐的,并且可能会导致微妙的bug和问题。