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关键字,效果非常好。