0

したがって、基本的に、コントローラー (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 つの異なるマシンが同時にアクセスしている場合、データベース テーブルが更新されているかどうかを確認します。

4

1 に答える 1

0

これを行うにはvollat​​ionプロパティを使用できます

private static volatile bool isExecuting = false;

public ActionResult Index()
{
   if(!isExecuting)
   {
      isExecuting = true;
      try
      {
          // Your instruction here.
      }
      finally
      {
         isExecuting = false;
      }          
   }
}

これで問題が解決する可能性があると思います。

于 2013-09-13T21:20:50.260 に答える