|
|
1
3
是的,缓存块对于旧版本的Entlib中的清理线程有一些问题,特别是当事情进入的速度比清理设置允许的快时。 这是在entlib5中完全重写的,所以现在缓存块中的线程不会超过两个,不管负载如何,而且通常只有一个。 |
|
|
2
2
如果应用程序设置了一个主线程,该线程在线程句柄上等待线程何时退出,而后台线程陷入循环或等待状态,并且从不退出线程进程,那么进程及其所有线程将永远不会退出。 检查线程代码,确保每个threadproc都有一个退出threadproc的清晰路径。在后台线程中编写一个无限循环是一种不好的形式,因为它假设在进程关闭时线程将被强制终止。 如果后台线程代码在循环中旋转,等待事件句柄发出信号,请确保您有某种方法来发出该事件的信号,以便线程可以正常有序地退出。否则,您需要编写后台线程来等待多个事件,并在任何一个事件发出信号时取消阻止。这些事件中的一个可以是后台线程主要感兴趣的活动,另一个可以是关闭事件。 从您发布的堆栈转储中的对象名称来看,线程似乎正在等待某个对象出现在ProducerConsumerQueue中。研究应该如何关闭队列对象(可能是在生产者端),以及关闭队列是否会自动释放等待该队列的所有使用者。 我的猜测是,要么队列没有被正确关闭,要么关闭它并不意味着释放等待它的消费者。如果是后一种情况,您可能需要通过队列发送一条terminate消息,以唤醒等待该队列的所有消费者,并告诉他们脱离等待循环并退出。 |
|
|
3
1
你有个大问题。每一个线程占用1MB的堆栈,在上下文中切换每一个线程是要付出很大的代价的。尤其是托管代码的情况更糟,因为每次GC必须运行时,它都要遍历线程堆栈以查找根,当这些线程被分页到磁盘时,从磁盘读取的成本很高,这就增加了性能问题。 创建线程是不好的,除非你知道你在做什么?杰弗里·里希特(Jeffery Richter)对此进行了详细的描述。 为了解决上述问题,我将查看这些线程被阻塞在什么上,并在线程创建上设置断点(例如windbg中的sxe ct) 稍后重新构建避免创建线程,而是使用线程池。
|
|
|
4
1
在MicrosoftEnterpriseLibrary4.1中,BackgroundScheduler类在每次实例化对象时都会创建一个新线程。会的 fixed http://entlib.codeplex.com/wikipage?title=EntLib5%20Beta2 |
|
|
user107586 · 如何处理等待句柄不会导致无限循环? 1 年前 |
|
|
ron burgundy · 获取-释放语义是否跨线程传递?[副本] 1 年前 |
|
|
BenjiFB · C#内存缓存:在一次操作中追加到列表? 1 年前 |
|
|
András Takács · Python多线程问题 2 年前 |
|
|
András Takács · Python多线程错误 2 年前 |