如果另一个请求正在运行方法,请等待直到完成

时间:2017-06-13 06:38:13

标签: c# asp.net concurrency

我正在使用C#,.NET Framework 4.7和MongoDb开发ASP.NET Web API应用程序。

我有这个方法:

[HttpPut]
[Route("api/Public/SendCommissioning/{serial}/{withChildren}")]
public HttpResponseMessage SendCommissioning(string serial, bool withChildren)
{
    string errorMsg = "Cannot set commissioning.";

    HttpResponseMessage response = null;
    bool serverFound = true;

    try
    {
        [...]
        // Mongo
        MongoHelper mgHelper = new MongoHelper();
        mgHelper.InsertCommissioning(serial, withChildren);
    }
    catch (Exception ex)
    {
        _log.Error(ex.Message);

        response = Request.CreateResponse(HttpStatusCode.InternalServerError);
        response.ReasonPhrase = errorMsg;
    }

    return response;
}

有时这个方法很快被调用,我在这里得到一个错误:

// Mongo
MongoHelper mgHelper = new MongoHelper();
mgHelper.InsertCommissioning(serial, withChildren);

这里我按顺序插入我收到的连续剧,有时我在MongoDb中收到重复密钥的错误:

我有一种方法来获取Mongo中使用的最新ID(主键)。并且两个请求获得相同的id,所以当我尝试将它插入Mongo时,我得到一个无效的密钥异常。

我想用一个队列来存储连续出版物,然后按照我收到它们的顺序使用它们。但是当我尝试在MongoDb中存储序列时,我想会得到同样的错误。

也许如果我可以设置一个方法,如果它正在运行,我必须等待运行它,它会工作。这个方法将把序列插入Mongo。

我该怎么做?一种方法,如果它正在运行,则无法在另一个Web Api请求中运行它。

或者,你知道更好的选择吗?

顺便说一句,我无法阻止这种方法。也许我需要使用这个同步部分运行一个线程。

0 个答案:

没有答案