这是C#中建议使用的锁吗?
看看下面的CRUD代码,我想知道是否真的有必要使用锁,以及它们是否可以省略:这是C#中建议使用的锁吗?,c#,asp.net-mvc,locking,C#,Asp.net Mvc,Locking,看看下面的CRUD代码,我想知道是否真的有必要使用锁,以及它们是否可以省略: private static readonly object Lock = new object(); /// <summary> /// Returns all contacts in the list. /// GET /Contacts/ (Content-Type:application/json) /// </summary> [Act
private static readonly object Lock = new object();
/// <summary>
/// Returns all contacts in the list.
/// GET /Contacts/ (Content-Type:application/json)
/// </summary>
[ActionName("Index"), AcceptVerbs(HttpVerbs.Get), IsAjaxRequest(true)]
public ActionResult GetAll()
{
lock (Lock)
{
return new JsonWithStatusCodeResult(HttpStatusCode.OK, Contacts);
}
}
/// <summary>
/// Returns the contact with the provided ID.
/// Get /Contacts/{id}
/// </summary>
[ActionName("Item"), AcceptVerbs(HttpVerbs.Get)]
public ActionResult GetById(Guid id)
{
lock (Lock)
{
var index = Contacts.FindIndex(x => x.Id == id);
if (index < 0)
{
ModelState.Clear();
ModelState.AddModelError("Id", "The provided ID does not exist in the collection");
return InvalidModelStateFilterAttribute.GetErrorResult(HttpStatusCode.NotFound, ModelState);
}
return new JsonWithStatusCodeResult(HttpStatusCode.OK, Contacts[index]);
}
}
private static readonly object Lock=new object();
///
///返回列表中的所有联系人。
///GET/Contacts/(内容类型:application/json)
///
[ActionName(“索引”)、AcceptVerbs(HttpVerbs.Get)、IsAjaxRequest(true)]
公共行动结果GetAll()
{
锁(锁)
{
返回新的JsonWithStatusCodeResult(HttpStatusCode.OK,联系人);
}
}
///
///返回具有所提供ID的联系人。
///获取/Contacts/{id}
///
[ActionName(“项”),AcceptVerbs(HttpVerbs.Get)]
公共操作结果GetById(Guid id)
{
锁(锁)
{
var索引=Contacts.FindIndex(x=>x.Id==Id);
如果(指数<0)
{
ModelState.Clear();
AddModelError(“Id”,“提供的Id在集合中不存在”);
返回InvalidModelStateFilterAttribute.GetErrorResult(HttpStatusCode.NotFound,ModelState);
}
返回新的JsonWithStatusCodeResult(HttpStatusCode.OK,Contacts[index]);
}
}
仅供参考-这是我正在查看的一个项目中的代码,我想知道在这种情况下是否有使用锁的逻辑原因
谢谢。任何局部变量都不需要锁定-如果您正在创建一个类型的新局部实例,该变量将不会被任何其他线程共享,除非您专门将其传递给其他线程 Edit:正如Michael Gunther指出的那样,我在
GetAll()
方法中遗漏了Contacts
——就像GetByID()
一样,如果Contacts
是静态对象,或者如果它以某种方式在线程之间传递,则需要锁定,否则就不需要锁定
您的
GetByID()
可能需要一些锁定,但如果不知道使用的所有对象,很难说Contacts
似乎是一个全局变量或成员变量,但是否需要锁定取决于它是否为静态变量,或者它是否正在传递给其他线程。从你的代码摘录中很难说<代码>联系人作为一个全局/静态联系人看起来非常可疑,但是-在ASP.NET应用程序中很少需要真正的全局联系人-大多数全局数据应该存储在数据库中,或者应该是不变的(在这种情况下,您在静态构造函数中初始化它,然后只在以后读取它,因此不需要锁定).在我看来很随意。Contacts
global对象(对于ASP.Net来说很奇怪)还是从其他线程更新的(同样没有代码显示这种情况)?为什么要锁定?您的请求将在单独的线程上处理,并且您似乎没有共享任何内容。Contacts
DB上下文吗?如果Contacts变量不是线程安全的,那么这些锁将确保不同线程不会同时使用它们。除此之外,我们还需要更多的细节来告诉“推荐”…GetAll()
可能需要锁定,这取决于它对联系人所做的操作,我认为这是this
@MichaelGunter的一个属性是的,你是对的。我错过了代码中的联系人
。)我将更新答案-ty。