请求与线程的关系

Relations between Requests and Threads

在ASP.NET(Web API 2 + OWIN,如果这很重要),如果收到新请求,是否会创建一个新线程?

我问这个问题是因为我有几个实用程序 类 可以修改我实体中的属性。我不确定在修改对象时是否需要实现 lock

// Controller endpoint
[HttpPut]
[Route("update/order")]
public HttpResponseMessage UpdateOrder(OrderDTO dto)
{
    OrderContext orderContext = new OrderContext();
    Order entity = orderContext.Orders.Single(e => e.Id == dto.Id);

    OrderUtil.UpdateOrder(entity, dto);
    orderContext.SaveChanges();

    return Request.CreateResponse(HttpStatusCode.OK);
}

// OrderUtil.UpdateSomething function
public static void UpdateOrder(Order entity, OrderDTO dto)
{
    // Do I need a lock here?
    lock (padlock)
    {
        entity.Status = dto.Status;
        entity.DeliveryDate = dto.DeliveryDate;
    }
}

当请求到达时,从线程池中挑选一个线程来为请求提供服务。如果没有线程,并且没有达到ThreadPool的最大线程数,则创建一个线程。

这仍然被认为是多线程的,服务器上正在处理的所有请求都在不同的线程上=>共享资源仍然可以被多线程同时修改。

因此,如果您需要控制对共享资源的并发访问,则需要 lock。但是如果资源是 Sql,你应该把锁定留给 Sql 服务器。

根据更新的问题更新:

使用您的代码,您不需要 lock,因为您为每个线程创建了不同的 OrderContext,并且传入了不同的 entityorderDto。这些对象不在线程之间共享。如果您担心数据的并发控制,这应该使用事务、Db 锁、时间戳等来处理,而不是 C# 锁。