【发布时间】:2018-06-06 08:40:25
【问题描述】:
这是我的场景:我正在开发一个用户可以“喜欢”产品的电子商务系统 (ASP.NET MVC)。我的网络服务 (.svc) 中有一个方法,如果用户已经喜欢该产品,它会删除喜欢的产品,如果用户没有,它会为产品添加一个喜欢的产品。
我这里有个问题:我通过Ajax异步调用'Like'方法,如果用户连续多次点击like按钮,那么,该方法被连续调用多次。由于此方法不是线程安全的,因此我可能在这里遇到问题。 (例如,它可能会为数据库中的一个用户多次插入like)
我一直试图通过使用lock 语句使其成为线程安全的,但显然它仍然不起作用。
这是我的网络服务方法:
private static Object productLikeLock = new Object();
[WebMethod, ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public bool ToggleProductLike(int productId)
{
try
{
if (User.Identity.IsAuthenticated)
{
lock (productLikeLock)
{
if (/* User has already liked the product */)
{
// Remove it from the database
return true;
}
else
{
// Add it to the database
return true;
}
}
}
return false;
}
catch (Exception ex)
{
return false;
}
}
谁能帮助我,让我知道我的代码和方法有什么问题? 提前致谢
【问题讨论】:
-
只是一个问题,如果您使用的是 MVC,为什么还要使用古老的 asmx 样式的 Web 服务而不是使用 Web API,这是现代推荐的方式并且通常更易于使用?这与您的问题无关,只是一个奇怪的设计决定。
-
@ADyson 我使用 WCF,这是一个写作错误
标签: c# asp.net ajax asp.net-mvc thread-safety