如果端点已经运行,如何确保端点不执行?

时间:2016-06-01 07:39:17

标签: c# asp.net ashx

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

我想我可以在线程池中的某处设置变量或什么?我不确定如何调查此事。一些领导将不胜感激。

我的例子:

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;
            }
        }
    }
}

1 个答案:

答案 0 :(得分:2)

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

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;
}