我有一个运行方法的端点。我想确保在我多次点击端点时运行它时不会执行该方法。
我想我可以在线程池中的某处设置变量或什么?我不确定如何调查此事。一些领导将不胜感激。
我的例子:
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;
}
}
}
}
答案 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;
}