2015-09-29 22 views
-1

我有以下情形:线程卡在锁中

线程池中有3个线程,每个线程池应该从9个操作列表中随机选取一个。有九个操作之间有两个不能同时进行,所以我使用这些2种方法(操作)象下面的锁定:

private Object lockThis6 = new Object(); 
private Object lockThis7 = new Object(); 

public void OpSix(uSupervisor supervisor) 
    { 
     lock (lockThis6) 
     { 
      try 
      { 
       //Intructions 
       //Event Handler 
       OnOpFinished(supervisor); 
      } 
      catch 
      { 

      } 
     } 
    } 

    public void OpSeven(uSupervisor supervisor) 
    { 
     lock (lockThis7) 
     { 
      try 
      { 
       //Intructions 
       //Event Handler 
       OnOpFinished(supervisor); 
      } 
      catch 
      { 

      } 
     } 
    } 

    //EventHandler 
    protected virtual void OnOpFinished(uSupervisor supervisor) 
    { 
     if (OpFinished != null) 
      OpFinished(this, new EventLoad(supervisor)); 
    } 

在指令结束时,一个事件被提升为“通知”线程随机选择一个操作。 有趣的是,有时线程会卡在锁定语句中,我试图找出它是否是死锁情况,但情况并非如此

+0

这些是你唯一的锁吗? – Domysee

+7

你可以准备[mcve](http://stackoverflow.com/help/mcve)吗?目前的代码太短而不正确。此外,在准备mcve时,你可能会自己找到问题的原因。 – Sinatr

+0

你在锁定语句中使用await吗? http://stackoverflow.com/questions/7612602/why-cant-i-use-the-await-operator-within-the-body-of-a-lock-statement – rmn36

回答

-1

我的代码中的问题是在事件处理程序中。由于事件处理程序在锁定语句中被调用,因此对于选择该操作的其他线程,锁定将始终被锁定。

通过简单地将事件处理程序移出锁定语句解决我的问题。

+0

这没有任何意义。你的代码显然不完整。你必须在你的EventHandler中有一些重入锁,但没有显示它。 – Aron