2011-08-29 168 views
0

我正在使用Asp.net MVC 3.任何我无法在MVC中创建线程过程的单个实例的原因?我试图一次只允许一个工作进程的单个实例。但是它一次允许多个实例。ASP中的信号量和锁定MVC3

我跟着这个例子: 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. 
    } 

回答

3

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

你会怎么写呢? – Mario

+0

我已经用示例更新了我的答案 – sternr

+0

好吧,我把工作进程中的锁移动了,它工作正常。谢谢! – Mario