我有MVC API控制器。此控制器中的一种方法是至关重要的。这意味着所有其他API方法都必须等待,直到这个方法完成。
我的基本想法是在构造函数中阻塞线程。但我不确定这是不是很聪明?
public class TestApi : Controller
{
private static bool wait = false;
public TestApi()
{
// wait if critical method is working.
while (wait)
{
System.Threading.Thread.Sleep(100);
}
}
[HttpPost]
public void PostCriticalMethod()
{
try
{
wait = true;
// do critical work
}
finally
{
wait = false;
}
}
// Many non critical API methods...
}解决方案二:
public class TestApi : Controller
{
private static bool wait = false;
private static AutoResetEvent waitHandle = new AutoResetEvent(false);
public TestApi()
{
// wait if critical method is working.
if (wait) waitHandle.WaitOne();
}
[HttpPost]
public void PostCriticalMethod()
{
try
{
wait = true;
// do critical work
}
finally {
waitHandle.Set();
wait = false;
}
}
// Many non critical API methods...
}发布于 2018-02-12 22:54:18
我的解决方案(这是异步版本,但非异步更简单):
在基类(所有控制器都通用)中,我添加了方法BlockOtherRequestsBeforeExecute
private static readonly SemaphoreSlim semaphoreInit = new SemaphoreSlim(1, 1);
protected async Task BlockOtherRequestsBeforeExecute(Func<Task> criticalAction)
{
await semaphoreInit.WaitAsync();
try
{
await criticalAction();
}
finally
{
semaphoreInit.Release();
}
}然后,如果我需要,我可以以安全的方式调用方法:
await BlockOtherRequestsBeforeExecute(async () => await RestoreDatabase());重要的是,必须在所有关键位置使用semaphoreInit。这可以在基类的构造函数中完成,然后所有API都会被阻塞,直到关键操作没有完成。
https://stackoverflow.com/questions/42207801
复制相似问题