问题标签 [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 投票
2 回答
532 浏览

asp.net - 线程池在 asp.net 请求处理下的行为

我们有一个场景,在从我们的代码中为来自 iis 的一个 asp.net 请求提供服务时,我们从线程池创建了一个子线程来服务一些后台任务。这个想法是在不依赖于我们的情况下完成处理请求的主线程子线程任务。但我们的疑问是,在 asp.net 中处理请求时,workerprocess 是否会等待线程完成其任务?

0 投票
5 回答
404 浏览

c# - 这是使用线程池的正确案例吗?

这是设置:我正在尝试制作一个相对简单的 Winforms 应用程序,一个使用FeedDotNet库的提要阅读器。我的问题是关于使用线程池。由于 FeedDotNet 正在生成同步 HttpWebRequest,因此它阻塞了 GUI 线程。所以最好的事情似乎是将同步调用放在 ThreadPool 线程上,并在它工作时调用表单上需要更新的控件。一些粗略的代码:

this= 主窗体实例

updatesPending= 主要形式的 volatile int

ProcessFeedResult= 对 Feed 对象执行一些操作的方法。由于线程池线程无法返回结果,这是通过主线程处理结果的可接受方式吗?

我担心的主要事情是它的规模。我一次尝试了大约 250 个请求。我见过的最大线程数大约是 53,一旦所有线程都完成,就会回到 21。我记得在我玩代码的一个特殊情况下,我看到它上升到 120。这不是不正常,是吗?此外,在 Windows XP 上,我认为连接数量如此之多,某处会出现瓶颈。我对吗?

我可以做些什么来确保线程/连接的最大效率?

有所有这些问题也让我想知道这是否适合使用 Threadpool。MSDN 和其他消息来源说它应该用于“短期”任务。考虑到我的连接速度相对较快,1-2 秒是否足够“短暂”?如果用户使用 56K 拨号,一个请求可能需要 5-12 秒甚至更多时间。那么线程池也会是一个有效的解决方案吗?

0 投票
2 回答
1171 浏览

.net - .Net 如何创建跨进程的所有 AppDomain 共享的自定义 ThreadPool?

我制作了一个针对我的特定需求进行优化的自定义 ThreadPool。但是,当进程中有多个 AppDomain 时,CLR ThreadPool 能够在所有 AppDomain 之间共享,我希望能够重现这种行为。

这可以使用 MarshalByRefObject 和 Remoting 来创建分布式线程池,但我担心它会增加不必要的开销,因为自定义线程池的关键目标是性能。

另一个理论上的解决方案是使用非托管对象破解 AppDomain 内存边界。如果我是正确的,AppDomain 中的内存边界仅适用于托管对象,因此每个 AppDomain 中可能有一个托管包装器都指向同一个非托管对象。

所以我的问题是:

  1. 有没有办法以最小的开销使用远程处理来制作自定义线程池?
  2. 如果没有,是否可以跨 AppDomain 共享非托管对象?
0 投票
2 回答
1871 浏览

asp.net - 使用具有长时间运行的 ADO.NET 查询的 ThreadPool 线程。这是可扩展的吗?

我们目前正在增强一个 ASP.NET 应用程序,该应用程序对许多产品执行报价。

目前现有的报价引擎基本上是一个大的存储过程(每次调用2-3秒),在过程调用之后运行少量的业务逻辑。

我们正在研究对每个产品的调用进行多线程处理,以加快一组报价。

我们目前的做法是将每个产品报价工作封装在一个 ThreadPool 线程中。这似乎表现得更好,但我有点担心,虽然它在少数用户中表现良好,但它会在生产环境中很好地扩展吗?

请注意,目前我们没有使用异步 ADO.NET 方法。

注意:我们调用 ThreadPool 的代码有一个将请求排队的节流阀,因此我们一次只能使用 ThreadPool 中可配置数量的线程。我们也不需要在同一页面上等待报价结果,我们允许用户进行并检查更新(报价结果页面使用 AJAX 来检查结果)。

进一步说明:首选解决方案是使用消息队列,因为报价服务是一种单向操作。但是,该项目的时间表并没有为我们提供时间来执行此操作。

与此同时,我们将修改实现以使用 ADO.NET 的异步方法(因为这是该进程的所有长时间运行方面所在),从而无需使用 ThreadPool 线程。

0 投票
5 回答
1647 浏览

c# - Windows 服务问题正在使用线程池

我创建了一个 Windows 服务,它目前有三个计时器。第一个定时器每 15 秒唤醒一次,第二个定时器每分钟唤醒一次。第三个计时器每天都在醒来。

问题是这些每次都产生新线程,并且有一次线程池完全用完。是否只产生 3 个线程而不产生更多新线程。

我的代码看起来像这样:

所以你可以看到它正在创建新线程,这将在某个时候用完线程池中的所有线程并突然停止 Windows 服务。目前它正在停止并记录事件 ID 为 5000 的事件日志。

0 投票
7 回答
65525 浏览

c# - C# - 线程池与任务

正如一些人可能在 .NET 4.0 中看到的那样,他们添加了一个新的命名空间System.Threading.Tasks,这基本上就是一个任务。从使用 ThreadPool 开始,我只使用了几天。

哪一个更高效,资源消耗更少?(或者只是整体更好?)

0 投票
4 回答
12838 浏览

wcf - WCF 服务中的线程

有一段代码:

我的测试客户端应用程序在 50 个线程中调用该服务(服务是 PerCall)。我发现非常令人不安的是,当我添加 Thread.Sleep(20000) WCF使用池中的不同线程每秒创建一个服务实例时。

当我删除 Thread.Sleep(20000) 时,会立即实例化 50 个实例,并且使用大约 2-4 个线程来执行此操作 - 实际上我认为这很正常。

有人可以解释为什么 Thread.Sleep 在创建实例时会导致那些有趣的延迟吗?

0 投票
2 回答
415 浏览

.net - 在 .NET 中为线程池排队的最佳项目数?

我正在构建一个后台处理引擎,它支持丢弃待处理和正在处理的项目。这适用于需要对某些输入元素进行大量处理的 winforms 应用程序,因此我正在构建一个队列引擎,我可以在其中将工作负载项排入队列,当它们被处理时,我会收到结果通知。

问题是,这个队列开始时几乎总是包含很多项目,我认为与其将所有内容都转储到线程池,不如只将前 N 个项目放入线程池,并在它们出现时继续回填处理。我想这样做的原因是,一旦我将它们转储到线程池中,它们就会被处理,即使它们被标记为丢弃,它们仍然会占用队列时间。

通过我所做的回填实现,如果项目被丢弃,我可以从队列中删除它们,并且只有在轮到它们时才将它们放入队列中,可以这么说。

所以问题是,我将如何计算这个数字 N,即要放入并保留在线程池队列中的项目数。

我考虑过的问题:

  • 我可能想将 2 * 数量的处理器排入队列,我看到这是典型的项目数,以确保所有处理器都在工作
  • 但是,如果某些项目的实际处理速度非常快(可能会发生),那么线程池中的队列在我自己的类可以回填更多工作之前就已经耗尽,所以也许我想要一个更大的数字以避免未充分利用处理器
  • 我是否应该创建一些自动调整例程来根据每个项目的当前时间计算最佳数字,这样如果它们都超快,数字会高得多,如果处理需要一些时间,它应该保留低的?

你怎么看?

:好的,由于答案之一,我将解释更多。放入队列的每个项目都由独特的东西键入。如果我使用与现有项目相同的键将另一个项目转储到队列中,则该旧项目被视为“丢弃”,应该被删除。如果正在处理项目,则工作负载项目上的属性设置为 true,即“IsDicarded”属性,处理方法负责调用该属性。如果它检测到丢弃的项目,它应该提前退出,不返回任何结果。

也许我应该做更多的试验,并尝试将所有内容都转储到线程池中。

新问题:我可以排队的物品数量有限制吗?如果没有,那么这将很容易简化我的课程。

注意:当我说“冗长的处理”时,我的意思是大约 1-10 秒。线程池甚至是最好的吗?我在网上看到关于“处理应该快速”的注释,但从未提及“快速”是什么。这里是毫秒级的快吗?

0 投票
2 回答
1457 浏览

c# - 在线程池中设置最小线程

我有一个应用程序,其中包含来自线程池的 4 个工作线程。它每 0.5 秒醒来一次。正如 msdn 中所写,线程池每 0.5 秒监视一次以创建空闲线程。我将最小线程数设置为 4,它解决了问题 - 一直没有更多的后台活动。我的问题是-我有另一个应用程序,它具有相同数量的线程threads-4,但是在这里将min thread 设置为4 并没有帮助,但是当将min thread 设置为5 时,后台监控将停止。线程池中具有相同数量线程的 2 个应用程序之间可能有什么区别 - 4 个线程。一个将最小线程设置为 4 有帮助,另一个仅将最小线程设置为 5 有帮助?

0 投票
4 回答
397 浏览

c# - vs2008 c#:线程池问题

我正在使用以下两种方法。名为 DoMyWork1 的方法确实可以很好地扩展,就像在 3 个线程中运行其中的三个需要 6 秒。而 DoMyJob 方法根本无法扩展。如果一个线程需要 4 秒,那么运行 3 个线程需要 13 秒。我究竟做错了什么?文件读取和/或写入是否需要线程池以外的特殊线程处理?

我的呼叫代码