加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

.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:

The calling thread does not own the lock for the specified object.

编辑:或者你在第一次锁定后锁定在不同的线程中,“也许在生产者线程中将使WorkItem出列并在池中启动它们,你在到达Monitor之前在该线程上调用lock(this.workQueue.SyncRoot)” .Pulse(this.workQueue.SyncRoot);.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读