请求与线程的关系
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
,并且传入了不同的 entity
和 orderDto
。这些对象不在线程之间共享。如果您担心数据的并发控制,这应该使用事务、Db 锁、时间戳等来处理,而不是 C# 锁。
在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
,并且传入了不同的 entity
和 orderDto
。这些对象不在线程之间共享。如果您担心数据的并发控制,这应该使用事务、Db 锁、时间戳等来处理,而不是 C# 锁。