【发布时间】:2011-07-25 18:53:03
【问题描述】:
我正在处理一个最近从 .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.1 更新到 4.0,而不是重新处理线程?这似乎是核心问题所在。
-
workQueue的类型是什么? -
当您
Pulse在您当前不拥有其监视器的对象上时,通常会引发异常。鉴于周围的lock语句显式进入this.workQueue.SyncRoot的监视器,这很难完成。Enqueue()是什么样的?workQueue是什么类型? (如果是自定义类型,请确保其SyncRoot实现返回一致的对象。) -
这里有些奇怪:原始代码在
workQueue上输入锁并在workQueue.SyncRoot上发出脉冲:这是错误的,应该会触发您看到的异常。但是,您更正的代码对我来说似乎有效。 -
抱歉,我的网络出现故障。 Workqueue 是一个队列对象(.net 类型),而 enqueue 是一种方法。我真的很想要一些想法,这样我就可以完成这个项目。
标签: .net multithreading .net-4.0 thread-safety