我有一个运行方法的端点。我想确保在多次击中端点时该方法在运行时不会执行。

我想我可以在线程池中的某个地方设置变量?我不确定如何进行调查。一些线索将不胜感激。

我的例子:

namespace Website.Import
{
    public class ImportProducts : IHttpHandler
    {
        private static bool running = false;
        public void ProcessRequest(HttpContext context)
        {
            context.Response.ContentType = "application/json";

            if (running)
            {
                throw new Exception("Already running");
            }

            running = true;

            try
            {
                var repo = new MemoryRepository();

                var productImporter = new ProductImporter(repo);
                var groupImporter = new GroupImporter(repo);
                var discountImporter = new DiscountImporter(repo);
            }
            finally
            {
                running = false;
            }

            context.Response.Write("Done");

        }

        public bool IsReusable
        {
            get
            {
                return true;
            }
        }
    }
}

最佳答案

您可以创建一个锁对象,以确保该操作不会并行运行。

private static object lockObject = new object();

lock (lockObject)
{
    // your code
}


但是可能存在问题:由于在所有会话之间共享静态变量,因此该方法将为每个用户锁定。

此行为可能是故意的。如果要阻止所有会话的执行,则可以使用此代码。如果只想阻止该用户执行,并允许该方法对每个用户同时运行一次,则必须将对象放入会话存储中。

如果仅想通知客户端它已经在运行,则还可以引发异常:

private static bool alreadyExecuting = false;

if (alreadyExecuting)
{
    throw new Exception("Already running");
}

alreadyExecuting = true;

try
{
    // your code
}
finally
{
    alreadyExecuting = false;
}

关于c# - 如果端点已经运行,如何确保端点不执行方法?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37562329/

10-09 23:43
查看更多