C# 信号量LIM是否应该在控制器中,而不是在链的较低位置?

C# 信号量LIM是否应该在控制器中,而不是在链的较低位置?,c#,semaphore,asp.net-core-webapi,C#,Semaphore,Asp.net Core Webapi,我们的生产环境中存在类似死锁的行为,我想知道我们是否正确使用了SemaphoreSlim 在我们的restapi中,代码如下所示: public async Task CreateAsync([FromBody]SomeModel SomeModel) { var result=await_someClass.CreateArende(someModel); 返回结果; } 公共异步任务注册表同步([FromBody]SomeModel SomeModel) { var result=wait_

我们的生产环境中存在类似死锁的行为,我想知道我们是否正确使用了
SemaphoreSlim

在我们的restapi中,代码如下所示:

public async Task CreateAsync([FromBody]SomeModel SomeModel)
{
var result=await_someClass.CreateArende(someModel);
返回结果;
}
公共异步任务注册表同步([FromBody]SomeModel SomeModel)
{
var result=wait_someClass.RegisterRende(someModel);
返回结果;
}
在我们的API的控制器级别中没有
SemphoreSlim
,但在某些类中如下所示:

公共类SomeClass
{
受保护的静态信号量lim_semphoreSlimCreateArende=新信号量lim(1,1);
公共异步虚拟任务CreateArende(SomeModel SomeModel)
{
尝试
{
wait_semphoreSlimCreateArende.WaitAsync();
}
最后
{
尝试
{
_semphoreSlimCreateArende.Release();
}
捕获(例外)
{
}
}
将新的SomeResponseDto()返回
{
...
};
}
公共异步虚拟任务注册表rende(SomeModel SomeModel)
{
尝试
{
wait_semphoreSlimCreateArende.WaitAsync();
}
最后
{
尝试
{
_semphoreSlimCreateArende.Release();
}
捕获(例外)
{
}
}
将新的SomeResponseDto()返回
{
...
};
}
}

信号量lim
是否应改为处于控制器级别?或者我应该将控制器操作更改为非异步吗?

这个问题有点脱节,但是让我们试着理解一下

首先让我们把图案弄对

try
{
    await _semphoreSlimCreateArende.WaitAsync();

    // do your sync work here

}
finally
{
    // if this throws you are certainly doing something wrong
    _semphoreSlimCreateArende.Release(); 
}
其次,你应该为此把键盘拿走

catch (Exception)
{
}
永远不要盲目地吃异常,如果你在
上获得异常,那么你已经有了严重的问题,你必须找出原因

信号量LIM应该在控制器级别吗

在最有意义的级别上使用它们,我的意思是如果你需要同步一段代码,就在那里同步,而不是13级以上

或者我应该将控制器操作更改为非异步

如果您有
asnyc
工作,请使控制器
async
,并让它向下传播到您的
async
代码

我们的生产环境中存在类似死锁的行为,我 不知道我们是否正确使用了信号量lim


哇,我们说的是数据库死锁,还是上下文死锁。无论哪种方式,这听起来都有点可疑

“在基于web的服务中使用信号量LIM可能是一种令人讨厌的方法。”-对于基于web的解决方案,异步代码的最佳实践是什么?Google async lock c#和semaphoreslim显示upI需要运行我的一个控制器方法synchronous,因为它使用com api,应该一次在一个请求上执行。我在控制器中选择了SemaphoreSlim而不是lock关键字,效果非常好。