我有一个特定的 asmx WebMethod,我想一次限制为一个正在运行的实例。
原因是它从数据库中读取数据,从文件中读取数据,处理数据,发送电子邮件,然后将数据存储回数据库,我担心如果同时运行两个实例可能会导致问题。
有没有办法强制执行?
[WebMethod]
public List<string> MyMethod()
{
using (myEntities context = new myEntities())
{
//read database, files and do other stuff here
context.SaveChanges();
}
}
或者也许我可以强制锁定数据库,以便只有一个线程可以在 using 语句中?
当前解决方案:
[WebMethod]
public List<string> MyMethod()
{
List<string> log = new List<string>();
if(!Monitor.TryEnter(_syncRoot)) {
log.Add("Proccess Currently Running");
return log;
}
try
{
using (myEntities context = new myEntities())
{
//doStuff
context.SaveChanges();
}
log.Add("Success");
}catch (Exception ex) {
log.Add(ex.Message);
} finally {
Monitor.Exit(_syncRoot);
}
return log;
}
笔记:
我目前的解决方案对于我运行多台服务器的情况似乎并不合适,我确实这样做了。也许在桌子上获得一个表锁,如果我无法获得锁,则抛出异常。我可以这样做吗?