一度に実行するインスタンスを 1 つに制限したい特定の asmx WebMethod があります。
その理由は、データベースからデータを読み取り、ファイルからデータを読み取り、データを処理し、電子メールを送信してからデータベースにデータを保存するためです。
これを強制する方法はありますか?
[WebMethod]
public List<string> MyMethod()
{
using (myEntities context = new myEntities())
{
//read database, files and do other stuff here
context.SaveChanges();
}
}
または、データベースを強制的にロックして、using ステートメント内に 1 つのスレッドしか存在できないようにすることはできますか?
現在の解決策:
[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;
}
ノート:
私の現在のソリューションは、複数のサーバーを実行している場合には不十分なようです。おそらくテーブルのテーブル ロックを取得し、ロックを取得できない場合は例外をスローします。これはできますか?