Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
这是C#中建议使用的锁吗?_C#_Asp.net Mvc_Locking - Fatal编程技术网

这是C#中建议使用的锁吗?

这是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

看看下面的CRUD代码,我想知道是否真的有必要使用锁,以及它们是否可以省略:

    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。