使用Lock停止并发执行不起作用
本文关键字:执行 不起作用 并发 Lock 使用 | 更新日期: 2023-09-27 18:20:56
我有一个API,我在其中做了很多处理,比如发送服务总线队列消息并接收它,向表中添加条目,然后最终向socket.io服务器发送事件。我希望所有这些都能得到并发执行的保护。我正在使用Lock,但它似乎不起作用。我遗漏了什么吗?下面是我的代码
public class BroadcastController : ApiController
{
private readonly Object _Lock = new Object();
[HttpPost]
[ActionName("UploadRecording")]
public async Task<HttpResponseMessage> UploadRecording()
{
// Check if the request contains multipart/form-data.
if (!Request.Content.IsMimeMultipartContent())
{
throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
}
string path = Path.GetTempPath();
var provider = new MultipartFormDataStreamProvider(path);
// Read the form data and return an async task.
var response = await Request.Content.ReadAsMultipartAsync(provider);
// processing the mime content
lock (_Lock)
{
// sending and receiving service bus messages
// adding records to table
// sending an event to socket.io
return Request.CreateResponse(HttpStatusCode.OK, new ResponseMessage<PersistedAudioRecord> { SuccessCode = 1, Message = "Broadcast Uploaded", Data = updatedRecord });
} } }
使_Lock对象为静态对象。否则,将为控制器的每个实例使用不同的锁。由于框架创建了一个新的控制器实例来处理每个请求,因此每个请求都锁定在不同的_Lock对象上,因此不提供并发安全性。
但是,请注意,即使是静态锁对象也只能在只有一个服务器的情况下工作。如果有多个服务器处理请求,则需要通过其他方式管理并发性。