阻止两个不同的人同时执行相同方法的最佳方法是什么?例如,用户A与用户B在同一页面上。两者都按下页面上的按钮,同时执行该事件的代码。我试图让一个等待另一个完成。
有没有通用的方法呢?
这里有更多信息..
这是一个简单的游戏,你可以购买网站的成员(比如FB上的自有游戏)。查询字符串是用户的ID。我有一个问题,两个人同时点击购买。一个得到用户而另一个只是亏钱。因此,我试图阻止在同一时间购买以阻止这种情况发生。
答案 0 :(得分:5)
将为每个请求创建一个Page
实例,因此假设您拥有的逻辑位于实例成员中且不访问任何共享内容,则不需要锁定。
如果点击共享资源,有几种方法可以强制执行锁定。一种方法是使用lock
语句,例如
private static someObject = new Object();
public void SomeMethod()
{
lock(someObject)
{
// do something with your shared resource.
}
}
一般来说,您应该尽量避免使用锁(尽管有很多情况需要锁定。)
修改强>
如果您将数据保存在支持交易的数据源中,例如就像数据库一样,那么你首先要检查用户在页面上点击“是”和接收响应的应用程序之间的时间内尚未购买用户试图购买的内容。因此,您需要检查数据源以查看它是否尚未购买,如果没有,则为用户“购买”该项目。这应该在交易内完成,因此它是原子的,因此如果“购买”项目的行动成功,您只需从用户的账户中取钱。
答案 1 :(得分:3)
您可以使用[MethodImpl]
属性装饰它:
[MethodImpl(MethodImplOptions.Synchronized)]
public static void SomeMethod()
{
...
}
这样只有一个线程可以执行该方法而其他线程将等待。它相当于将lock
放到整个方法体上。