我正在使用最近从.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,但这对我没有多大帮助,因为我不太了解他的问题和解决方案。
希望有人可以给我一些提示。
谢谢!
答案 0 :(得分:1)
因为您正在使用自己的线程池机制。然后异常可能是因为线程在lock
之后和调用Monitor.Pulse
之前发生了变化。根据msdn,这个例外将在Pulse
if:
调用线程不拥有指定对象的锁。
编辑:或者您在第一次锁定后锁定了不同的线程,“也许在生产者线程中将WorkItem
出列并在池中启动它们,您正在调用{ {1}}“在到达lock (this.workQueue.SyncRoot)
之前的那个帖子。