.net – 一些旧代码的线程问题
发布时间:2020-12-20 13:24:08 所属栏目:Python 来源:网络整理
导读:我正在开展一个最近从.net 1.1升级到.net 4.0的项目.我们从自定义的“ThreadPool”类中得到一个错误(是的,有人觉得有必要写自己的),现在我想知道它可能是什么. 从以下代码抛出错误: private void Submit(WorkItem work) { this.AdjustPoolSize(); lock (thi
我正在开展一个最近从.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,但这对我没那么帮助,因为我不太了解他的问题和解决方案. 希望有人可以给我一些提示. 谢谢! 解决方法
由于您使用自己的线程池机制.然后异常可能是因为线程在锁定之后和调用Monitor.Pulse之前已经发生了变化.根据msdn,如果出现以下异常将抛出Pulse:
编辑:或者你在第一次锁定后锁定在不同的线程中,“也许在生产者线程中将使WorkItem出列并在池中启动它们,你在到达Monitor之前在该线程上调用lock(this.workQueue.SyncRoot)” .Pulse(this.workQueue.SyncRoot);. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |