一些旧代码的线程问题

时间:2011-07-25 18:53:03

标签: .net multithreading .net-4.0 thread-safety

我正在使用最近从.net 1.1升级到.net 4.0的项目。我们从自定义的“ThreadPool”类中得到一个错误(是的,有人觉得有必要写自己的),现在我想知道它可能是什么。

从以下代码中抛出错误:

    private void Submit(WorkItem work)
    {
        this.AdjustPoolSize();

        lock (this.workQueue.SyncRoot)
        {
        //Monitor.Enter(workQueue);
        this.workQueue.Enqueue(work);
            Monitor.Pulse(this.workQueue.SyncRoot);
        //Monitor.Exit(workQueue);
        }
    }

注释代码是我如何交付代码的。不幸的是,我根本不了解这个项目,只是来解决这个问题。我们看到的错误是:

System.Threading.SynchronizationLockException was unhandled by user code
  Message=Object synchronization method was called from an unsynchronized block of code.
  Source=mscorlib
  StackTrace:
       at System.Threading.Monitor.ObjPulse(Object obj)
       at System.Threading.Monitor.Pulse(Object obj)
       at CustomThreadPoolObject.Submit(WorkItem work) in D:\...\Threading.cs:line 1438
       at CustomThreadPoolObject.Submit(WaitCallback callback, Object state) in D:\...\Threading.cs:line 1349
       at SomeGroupProcessFunctionality.Submit(PooledThread thread, TaskInfo task, String appServer, Hashtable batchHandleTable) in D:\...\ProcessGroup.cs:line 143
       at System.Runtime.Remoting.Messaging.Message.Dispatch(Object target, Boolean fExecuteInContext)
       at System.Runtime.Remoting.Messaging.StackBuilderSink.SyncProcessMessage(IMessage msg, Int32 methodPtr, Boolean fExecuteInContext)
  InnerException: 

从它的外观来看,当事实并非如此时,某些东西被触发为“可用”。我试图谷歌这个并发现http://bbellomo.blogspot.com/2007/03/object-synchronization-method-was.html,但这对我没有多大帮助,因为我不太了解他的问题和解决方案。

希望有人可以给我一些提示。

谢谢!

1 个答案:

答案 0 :(得分:1)

因为您正在使用自己的线程池机制。然后异常可能是因为线程在lock之后和调用Monitor.Pulse之前发生了变化。根据msdn,这个例外将在Pulse if:

  

调用线程不拥有指定对象的锁。

编辑:或者您在第一次锁定后锁定了不同的线程,“也许在生产者线程中将WorkItem出列并在池中启动它们,您正在调用{ {1}}“在到达lock (this.workQueue.SyncRoot)之前的那个帖子。