【问题标题】:Semaphores and Lock in ASP MVC3ASP MVC3 中的信号量和锁定
【发布时间】:2011-08-29 10:58:59
【问题描述】:

我正在使用 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.
     }

【问题讨论】:

    标签: asp.net-mvc-3 locking semaphore


    【解决方案1】:

    你的代码有几个问题,但最重要的是 - 你只锁定了 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 */
      }
    }
    

    【讨论】:

    • 好的,我将锁移到了工作进程中,它起作用了。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-07
    • 1970-01-01
    相关资源
    最近更新 更多