0

我有一个 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 });
}   }    }
4

1 回答 1

5

将 _Lock 对象设为静态。否则,您将为控制器的每个实例使用不同的锁。由于框架创建了一个新的控制器实例来处理每个请求,每个请求都锁定在不同的 _Lock 对象上,因此不提供并发安全性。

但是,请注意,即使是静态锁定对象也只有在您拥有单个服务器时才能工作。如果您有多个服务器处理请求,则需要通过另一种方式管理并发。

于 2013-07-04T14:12:23.143 回答