在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;
}
}
答案 0 :(得分:0)
当请求到达时,从ThreadPool中挑选一个线程来为请求提供服务。如果没有线程并且未到达ThreadPool的最大线程,则创建一个线程。
这仍然被认为是多线程的,在服务器上处理的所有请求都在不同的线程上=>共享资源仍然可以由多线程同时修改。
因此,如果您需要控制对共享资源的并发访问,则需要lock
。但是如果资源是Sql,则应该将锁定保留给Sql server。
根据更新后的问题进行更新:
使用您的代码,您不需要lock
,因为您为每个帖子创建了不同的OrderContext
,并传入了不同的entity
和orderDto
。线程之间不共享这些对象。如果您担心数据的并发控制,则应使用事务,Db锁,时间戳,....而不是c#locks来处理。