首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >API方法必须等待,直到关键方法完成

API方法必须等待,直到关键方法完成
EN

Stack Overflow用户
提问于 2017-02-13 23:35:09
回答 1查看 79关注 0票数 0

我有MVC API控制器。此控制器中的一种方法是至关重要的。这意味着所有其他API方法都必须等待,直到这个方法完成。

我的基本想法是在构造函数中阻塞线程。但我不确定这是不是很聪明?

代码语言:javascript
运行
复制
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...
}

解决方案二:

代码语言:javascript
运行
复制
 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...
    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-12 22:54:18

我的解决方案(这是异步版本,但非异步更简单):

在基类(所有控制器都通用)中,我添加了方法BlockOtherRequestsBeforeExecute

代码语言:javascript
运行
复制
        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();
            }
        }

然后,如果我需要,我可以以安全的方式调用方法:

代码语言:javascript
运行
复制
await BlockOtherRequestsBeforeExecute(async () => await RestoreDatabase());

重要的是,必须在所有关键位置使用semaphoreInit。这可以在基类的构造函数中完成,然后所有API都会被阻塞,直到关键操作没有完成。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42207801

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档