したがって、基本的に、コントローラー (SomeController.cs) メソッドがあり、それを Index() と呼びます。負荷の高い処理が必要なため、Index() ローカルおよび異なるマシンへの 2 つの同時アクセスを防止したいと考えています。これが私のコントローラーメソッドの外観です
public ActionResult Index()
{
ViewBag.controllerObj = this;
if(! _Ready)
{
lock(_Locker)
{
if(!_Ready)
{
ViewBag.canStart = true;
_Ready = true;
}
}
}
}
public bool canStart(ViewDataDictionary vd)
{
// Override the controller's ViewData dictionary with the one passed from the view.
ViewData = vd;
Setting settings = data.Settings.FirstOrDefault();
if (settings == null)
{
settings = new Setting();
data.Settings.Add(settings);
data.SaveChanges();
}
var starter = new Guid();
data.Entry(settings).Reload();
if (settings.startedBy.HasValue && settings.startedBy != starter)
{
return false;
}
settings.startedBy = starter;
ViewBag.Settings = settings;
data.SaveChanges();
return true;
}
次に、ファイルの上部にある Index.aspx を次のようにします。
var canStart = false;
if(ViewBag.canStart != null)
{
canStart = (bool)ViewBag.controllerObj.canStart(ViewData);
}
if(canStart)
{
// Heavy duty processing
}
したがって、私の質問は、同じブラウザーの 2 つのタブで Some/Index に移動すると、Index.aspx に次々とアクセスできるようになることです。なぜそうなのですか?2 つの異なるブラウザーでテストすると、一方のブラウザーは処理を進め、もう一方のブラウザーは処理を進めません。
アップデート:
そのため、ロックを解除し、ダブル チェック ロックの代わりに、メモリ内で共有されるプライベートな静的変数を 1 つだけ使用します。また、2 つの異なるマシンが同時にアクセスしている場合、データベース テーブルが更新されているかどうかを確認します。