问题标签 [threadpool]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
778 浏览

c# - 线程卡在 MySqlCommand.ExecuteNonQuery()

我想对方法进行并行调用。在这种方法中,我计算了一些值(非常快)并将该计算的值写入数据库表中。

因此我使用线程池

经过一段时间的计算(不确定,发生这种情况的时间会有所不同,有时在几分钟后,有时在几个小时后)线程池已满,但不是方法()的线程,而是我的mysql类的线程来电MySqlCommand.ExecuteNonQuery

有谁知道如何避免这种情况?在 mysql 类的文档中,我发现您无法终止正在执行的查询,但如何避免此类问题?

0 投票
1 回答
2669 浏览

c# - 当线程池线程返回池时,更改线程池线程的文化会影响它吗?

如果我设置CurrentCulture了线程池线程,当线程完成执行并返回到线程池时会发生什么?它是否将其CurrentCulture重置为默认值(无论这可能意味着什么),还是会保留我设置的文化?

我希望框架将线程重置为默认状态以防止这种情况发生,但找不到任何有关此效果的文档。我发现的最接近的来自ThreadPool的 MSDN 文档:

线程池重用线程时,不会清除线程本地存储中的数据,也不会清除带有 ThreadStaticAttribute 属性标记的字段中的数据。因此,通过一种方法放置在线程本地存储中的数据可以暴露给由同一线程池线程执行的任何其他方法。

这似乎表明线程在返回时没有被重置。

我已经尝试了一些示例代码来尝试对此进行测试,并且似乎确实重置了文化,但我不相信我正在正确测试此行为,因为我认为我只使用了 ThreadPool 线程的一小部分,并且所以不能确定我正在测试一个已经拥有它的文化集的线程。

0 投票
2 回答
2636 浏览

c# - System.Timers.Timer Elapsed 的执行时间比 Button_click 长 10 倍

我有一个相当流程密集型的方法,它采用给定的集合,复制项目(Item 类具有正确定义的 Copy() 方法),用数据填充项目并将填充的集合返回到类的集合属性

此方法以两种方式调用:根据请求和通过 System.Timers.Timer 对象的“Elapsed”事件。

现在,收藏中的 40 件物品几乎不需要任何时间。无论是通过 button_click 填充“ad hoc”还是由 Timer 对象填充。

现在,当我增加集合的大小(另一个具有 1000 个项目的 MyClass 对象)时,可以预见该过程需要更长的时间,但总共大约需要 6 秒。很好,那里没有问题。在初始化时被调用(form_load)或被称为 ad hoc(button_click)它停留在 6 秒左右。

但是,System.Timers.Timer 对象正在调用相同的方法(如在确切的代码行中)。并且 Elapsed 大约需要 60 秒(其他运行 unclide 56 秒、1 分钟 2 秒、1 分钟 10 秒......你明白了)。相同过程的十倍!

我知道 System.Timers.Timer 对象是在线程池中执行的。这可能是原因吗?是线程池的优先级较低还是整个排队都占用了时间?

简而言之,有什么更好的方法呢?使用 System.Windows.Forms.Timer 在同一个 UI 线程中执行?

谢谢!

好的,一些附加信息:

计时器操作发生在 UI 调用的 DLL 中。主“处理程序”类本身有一个定时器对象的集合,它们都订阅同一个事件处理程序。处理程序类的初始化有点像这样:

我实际上继承了 Timer 类来给它一个“索引”属性(还有 eventArgs)。这样,在一个事件处理程序 (tmr_Elapsed) 中,我可以识别计时器用于哪个 MyClass 对象并采取行动。

处理程序类已经在其自己的线程中运行,并触发自定义事件以深入了解其操作。该事件在 UI 中处理(UI 控件的跨线程访问等),并在收到事件处理时显示。对于“初始化”和“临时”调用都是如此(在这些情况下没有问题)。

实际的 Elapsed 事件如下所示:

0 投票
2 回答
4609 浏览

java - Java 电子邮件发送队列 - 固定数量的线程发送尽可能多的可用消息

我正在编写一个消息处理应用程序(电子邮件),我想要一个传出队列。我设计这个的方式是有一个单例队列类,ThreadedQueueSender,由一个 Executor Service 和一个 BlockingQueue 支持。此外,javax.mail.Transport 对象的线程池用于获取和释放与传出 SMTP 服务器的连接。

此类公开了一个方法,add(MimeMessage)该方法将消息添加到工作队列 ( BlockingQueue)。

在类的实例化时,它ExecutorService被初始化为ThreadPoolExecutor具有固定数量的线程,比如说 5。每个线程的run()方法都处于无限循环中,只有在检测到中断时(ExecutorService.shutdownNow()被调用时)才退出。

此运行方法用于BlockingQueue.poll()从工作队列中获取消息,直到没有更多可用而不阻塞,然后Transport从连接池请求一个对象,打开连接,发送它检索到的所有消息,关闭连接并返回Transport对象。

这行得通,但我觉得我没有通过在应用程序的生命周期内运行固定数量的线程来充分利用 ExecutorService。此外,我自己管理工作队列,而不是让并发框架处理它。其他人将如何实现此功能?将每个传入消息包装在 Runnable 中,然后执行发送逻辑是否更好?

谢谢,任何意见表示赞赏。

瑞安

0 投票
1 回答
1270 浏览

c# - ThreadPool.SetMinThreads() 可以将completionPortThreads 数设置为0吗?

我想设置最小线程数。我知道我需要的workerThreads 的数量,但是关于completionPortThreads 它的大小应该是多少(默认情况下它等于处理器的数量)。我可以将其设置为 0 还是有风险?什么时候使用?

0 投票
2 回答
4260 浏览

java - Java中如何判断线程池是否空闲

我有一个使用创建的线程池

无论如何我可以等到游泳池闲置吗?我的意思是所有线程都没有运行,队列中没有任何东西在等待。

我在网上搜索,所有解决方案都对我不起作用。例如,我不想关闭池,所以 awaitTermination() 不起作用。我也知道如何 getTaskCount() 但我不想继续轮询池,这会浪费 CPU。

这是一个大型项目,我不想更改池中运行的所有任务,因此我正在寻找一些不依赖任务合作的解决方案。所以闩锁或障碍对我不起作用。

0 投票
4 回答
10459 浏览

java - 在 Threads 中访问作用域代理 bean

我有一个在 tomcat 中运行的 Web 应用程序,我使用 ThreadPool (Java 5 ExecutorService) 并行运行 IO 密集型操作以提高性能。我想让每个池线程中使用的一些 bean 在请求范围内,但是 ThreadPool 中的线程无权访问 spring 上下文并获得代理失败。关于如何使 ThreadPool 中的线程可以使用 spring 上下文以解决代理故障的任何想法?

我猜必须有一种方法可以为每个任务在 ThreadPool 中注册/注销每个线程,但是没有任何运气找到如何做到这一点。

谢谢!

0 投票
4 回答
1416 浏览

.net - 如何本地化来自应用程序中所有线程的字符串资源查找?

推荐的最佳实践是设置应用程序线程的当前区域性,以使资源查找能够使用正确的语言。

不幸的是,这并没有为任何其他线程设置文化。这对于线程池线程来说尤其是一个问题。

问题是:如何使用最少的额外管道代码从线程池线程正确本地化启用字符串资源查找?


编辑:

问题是从字符串表生成的这段代码。

在这种情况下,没有为线程池线程正确设置“resourceCulture”。我可以调用'ResourceManager.GetString("IDS_MYSTRING", correctCulture);' 但这意味着失去编译时检查字符串是否存在的好处。

我现在想知道修复是否是将字符串表的可见性更改为公共并设置使用反射枚举的所有程序集的 Culture 属性。

0 投票
4 回答
6617 浏览

c# - C#降低线程池中的线程优先级

当一些 cpu 时间可用时,我有几个低重要性的任务要执行。如果其他更多导入任务正在运行,我不希望执行此任务。即,如果一个正常/高优先级任务来了,我希望低重要性任务暂停,直到重要性任务完成。

有相当多的低重要性任务需要执行(50 到 1000)。所以我不想为每个任务创建一个线程。但是我相信线程池不允许某些优先级规范,不是吗?

你会怎么解决这个问题?

0 投票
3 回答
312 浏览

c# - 在库中使用 ThreadPool 是否可以接受?

可以ThreadPool在图书馆使用吗?

因为如果您的库的用户也在使用这显然可能会导致一些不愉快的问题ThreadPoolThreadPool当然是因为是静态类)..

什么是约定?