Семафоры и блокировки в ASP MVC3 - PullRequest
0 голосов
/ 29 августа 2011

Я работаю с Asp.net MVC 3. Любая причина, почему я не могу создать отдельный экземпляр процесса потока в MVC?Я пытаюсь разрешить один экземпляр рабочего процесса по одному.однако он допускает более одного экземпляра одновременно.

Я последовал примеру на: http://msdn.microsoft.com/en-us/library/system.threading.semaphore.aspx

Это код в моем контроллере:

    private static Semaphore _pool;
    public ActionResult StartBots(int id)
    {
        _pool = new Semaphore(0, 1);

        Thread t = new Thread(SingletonWorker);
        t.Start();

        _pool.Release(1);

        return RedirectToAction("index", new { id = id });
    }

Я также пробовал этот пример с помощью блокировки: http://msdn.microsoft.com/en-us/library/c5kehkcz(v=VS.80).aspx

    private Object thisLock = new Object();
    public ActionResult StartBots(int id)
    {
        Thread t = new Thread(SingletonWorker);
        lock (thisLock)
        {
            t.Start();
        }

        return RedirectToAction("index", new { id = id });
    }

-------------------------------- рабочий ------------------------------------

    private static void SingletonWorker()
    {
          _pool.WaitOne(); <== this only applies to the Semaphore example.

          // Do something here.

          Thread.Sleep(rand.Next(4) * 200 + 1000);

          // Do something else here.
     }

1 Ответ

3 голосов
/ 29 августа 2011

В вашем коде есть несколько проблем, но самая важная из них - вы блокируете только Thread.Start, но это не обещает, что у вас будет только один параллельный поток, это означает только то, что заблокировано только создание потока.

Если вы хотите, чтобы потоки работали последовательно, вы можете использовать следующий код:

private static Object _lockKey = new Object();
public ActionResult SomeAction(int someParam)
{
  ThreadPool.QueueUserWorkItem(doWork, SOME_STATE);
  return SOMETHING;
}

private void doWork(object state)
{
  lock (_lockKey)
  {
    /* Because of the static lockKey, this code will not be invoked serially */
  }
}
...