C# 如果另一个请求正在运行方法,请等待完成
我正在用C#、.NET Framework 4.7和MongoDb开发一个ASP.NET Web API应用程序 我有这个方法:C# 如果另一个请求正在运行方法,请等待完成,c#,asp.net,concurrency,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
[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请求中运行它的方法
或者,你知道更好的选择吗
顺便说一下,我不能阻止这种方法。也许我需要用这个同步部分运行一个线程。使用一个按顺序处理请求的单例。或者在mongohelper中添加一个包装器,它使用某种形式的同步来添加您的行为。这不只是一个设计缺陷吗?你期望序列号是唯一的,但它不是?如果这是在同一个实例上,您可以锁定
InsertCommisioning
@rene中的静态对象。我有一个方法来获取Mongo中使用的最新id(主键)。两个请求得到相同的id,所以当我尝试在Mongo上插入它时,我得到了一个无效的密钥异常。好吧,只是没有得到最新的id。只要让客户端提供他们的新数据,插入Mongo并告诉客户端新数据刚刚得到的密钥。问题解决了,没有任何麻烦。数据库非常擅长在高负载下生成唯一的id…但我需要按照收到的顺序插入序列号。如果我让方法在我收到的另一个序列之前插入一个序列,那么它就是一个错误。这就是我想使用队列的原因。使用一个按顺序处理请求的单例。或者在mongohelper中添加一个包装器,它使用某种形式的同步来添加您的行为。这不只是一个设计缺陷吗?你期望序列号是唯一的,但它不是?如果这是在同一个实例上,您可以锁定InsertCommisioning
@rene中的静态对象。我有一个方法来获取Mongo中使用的最新id(主键)。两个请求得到相同的id,所以当我尝试在Mongo上插入它时,我得到了一个无效的密钥异常。好吧,只是没有得到最新的id。只要让客户端提供他们的新数据,插入Mongo并告诉客户端新数据刚刚得到的密钥。问题解决了,没有任何麻烦。数据库非常擅长在高负载下生成唯一的id…但我需要按照收到的顺序插入序列号。如果我让方法在我收到的另一个序列之前插入一个序列,那么它就是一个错误。这就是我想使用队列的原因。