问题标签 [queueuserworkitem]
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.
c# - 使用 Mono C# 的 QueueUserWorkItem() 性能问题
在调用 QueueUserWorkItem() 时,我的分析器中出现间歇性峰值。我每秒排队大约 20 个工作。就复杂性而言,每项工作大致相同。95% 的作业在调用 QueueUserWorkItem 时花费的时间不到 0.01 毫秒。但是每隔几秒钟,似乎是随机的,一项工作需要 20-60 毫秒!
我正在尝试构建一个平滑的模拟,而只是将我的后台任务排队会导致我的帧速率出现严重故障。
这不是作业实际完成所需的时间,而是简单地排队作业所花费的时间。我希望这几乎不需要任何时间,所以这非常令人沮丧。
我尝试过的事情:
- 每秒排队较少的工作只会导致相应地减少故障,但它仍然会出现故障。
- 将 lock(obj) 放在对 job.queued 变量的所有访问中
- 使用 SmartThreadPool 而不是 defaultThreadPool。STP 的 QueueWorkItem() 中仍然存在问题
c# - C# 中的 ASP.NET:QueueUserWorkItem 中的自定义委托函数未更新
我有一个 aspx 网页,其中应该使用我传递给委托的消息来更新标签,但每次我这样做时,标签都不会更新。下面我给你一些代码。
默认.aspx
default.aspx.cs(后面的代码):
最后是事件和委托所在的类:
现在,每次将 DoEncrypt 方法添加到 QueueUserWorkItem 时,它都会完美运行,并且一切都会正确完成。调试时,我注意到后面代码中的方法 feedbackInfo 被正确调用,这里是:
我假设该方法有效,因为当我从 ThreadPool 中调用 feedbackInfo 方法三次时,实际上它确实被调用了三次。每次两个标签的 Text 属性都包含之前分配的值。
所以唯一的问题是,每次标签文本属性更改时,页面都不会更改。有任何想法吗?
.net - ThreadPool.QueueUserWorkItem 与 Parallel.For
我试图理解 和 之间的Parralel.For
区别ThreadPool.QueueUserWorkItem
。
硬件软件:
- Intel i5(四核)
- Windows 7 64 位教授
- 点网 4.5
案例一代码:线程池
输出:
使用线程 10 (45.871) 完成 0 使用线程
11 (45.875)
完成 1 使用线程 12 (45.875)
完成 2 使用线程 13 (45.875)
完成 3 使用线程 10 (46.869) 完成 4
案例2代码:Parallel.For
输出:
使用线程 10 (16.923) 完成 0 使用线程
11 (16.925)
完成 1 使用线程 12 (16.925)
完成 2 使用线程 13 (16.926)
完成 3 使用线程 14 (16.926 ) 完成 4
问题:
从案例 1 的结果来看,似乎只有四个线程处于活动状态,然后使用第一个空闲线程完成最终任务。在情况 2 中,似乎有五个线程立即专用并“同时”执行。
为什么 QueueUserWorkItem 的线程处理不使用第五个线程,如并行类?
(ThreadPool.GetAvailableThreads(...)
确认有 1023 个工作线程可用)。
c# - 带有2个WaitCallback的ThreadPool有时会卡住
我正在尝试使用 ThreadPool.QueueUserWorkItem 但似乎如果我要运行其中的 2 个,这意味着:
它有时会卡住不到一秒钟。有任何想法吗?
其中一个调用是游戏倒计时:
ThreadPool.QueueUserWorkItem(new WaitCallback(x=>initClock(0,0)));
c# - 带有 lambda 表达式的 QueueUserWorkItem 参数?
在下面的代码中,参数 's' 代表什么?我们可以不只是省略's',因为它没有在方法中使用,所以我们有一个没有参数的匿名方法,如 () => ...?
更新 1:
根据接受的答案,匿名方法只是普通 WaitCallback 委托方法的替代品,如下面的 ocd 中的委托方法,QueueUserWorkItem 需要它作为参数。因此,'s' 应该是对象类型,因为它是 ThreadProc 方法的参数。
c# - 如何监控 .Net 线程池的状态?
是否可以找出线程池中线程的状态?我们的应用程序有时会使用很多线程,而这些主要是调用 ThreadPool.QueueUserWorkItem。但是,当应用程序没有真正做太多事情时,线程数永远不会减少。我原以为最终这些线程会停止。
阅读周围我相信他们应该在完成所有任务后进入暂停状态,然后如果不重用最终唤醒并被终止。
该应用程序使用 .Net Compact Framework v2。可能是线程卡住了,但是当我在 Visual Studio 中暂停应用程序时,线程窗口仅显示大约 7-8 个线程。与 v2005 捆绑的远程进程查看器表明该进程正在使用超过 40 个线程。我只能假设它只是等待使用的线程池线程。
可以使用什么方法来测试 ThreadPool 中的工作是否已完成并且线程是否正在释放回池中?
编辑 1
这取自 .NET Compact Framework 远程性能监视器,线程池线程数为 25。但是就像我在 Visual Studio 本身中所说的那样,肯定没有 25 个线程,只有大约 7 或 8 个。
.net - 使用 .NET ThreadPool 时的内存泄漏
我正在使用System.Threading.ThreadPool.QueueUserWorkItem()来运行我的任务。
运行我的应用程序时,我注意到它占用了大量内存,我使用任务管理器获取了一个转储文件。调查了一下,发现很多线程卡在下面的栈中:
或者
为什么这些线程卡住了?我是否使用了错误的 API?也许我没有正确管理线程?
c# - 跟踪 .NET/IIS 程序中的线程使用情况
我们有多线程的软件。一个源线程启动一堆并行任务(每个任务涉及一些处理和一些与第 3 部分 API 的对话)并等待它们中的一些或全部完成。
每个线程需要 3-30 秒来完成它的工作。
我们发现(在 prod 中)在调用ThreadPool.QueueUserWorkItem
和线程实际启动之间可能存在长达 10 秒的延迟,因此我们认为线程池中可用线程的供应已经饱和。有关该限制的评论,请参见此处:System.Threading.ThreadPool.SetMaxThreads 的默认值
我们希望能够跟踪这些不同数量的线程,以便一旦我们进行了各种更改,我们就可以指出一些东西并说“看,我们已经解决了用完所有线程的问题”。
此 MSDN 页面:https ://msdn.microsoft.com/en-us/library/ff650682.aspx暗示没有计数器可以跟踪此类事情,仅提供 DIY 计数器的建议实现。
另一方面,此页面:http: //blogs.iis.net/mailant/new-worker-process-performance-counters-in-iis7说计数器确实存在吗?似乎说“最大线程数”,“总线程数”和“活动线程数”应该是相关的。我会假设这些意味着:
- “最大”:TP 可以创建多少线程,然后它必须开始等待旧线程死亡,然后才能创建新线程。
- “活动”:在任何给定时间实际有多少线程在运行我们的程序代码。
- “全部的”: ??我猜这是“活动”+“已启动但正在等待外部资源的线程数”?在我们的例子中是第 3 方 API,但通常它可能是磁盘 IO 或数据库访问等。
我试图通过打开 Perf Monitor 来查看这些,“添加新计数器”>“W3SVC_W3WP”>选择这 3 个特定计数器>选择我们的特定进程>“添加”>“确定”。
然后 Perf Monitor 图表告诉我们: Max = 256 Total = 16 Active = 0 !?
这似乎……不太可能?我假设我误解了计数器,或者错误配置了 Perf Monitor?
我们的下一个尝试是在任务管理器中查看进程的“线程”列(通过 IIS 管理器中的 PID 识别正确的 w3wp 进程)。这通常表明有 100-150 个线程,但如果我真的破坏了进程(向它正在运行的 API 端点发送垃圾邮件),那么我可以得到超过 256 的数字(我曾在 264 处看到它)。
任何人都可以对此有所了解吗?
从根本上说,我的问题是,所有这些不同的数字/统计数据在上下文中的具体含义是ThreadPool.QueueUserWorkItem
什么,以及跟踪 ThreadPool 的线程可用性状态的最佳方法是什么。
c++ - 使用私有成员函数调用 Win32 QueueUserWorkItem()
我正在尝试将私有成员函数(不应作为公共或受保护的)调用为具有 Win32 函数的工作项QueueUserWorkItem()
。我知道我以前做过,而且很容易,但现在我找不到那个片段,也不能让bind()
伏都教工作。因此,就这个问题而言,该课程是:
在里面UsefulPublicFunction()
我们可能会看到:
我似乎在杂草丛生的地方是分配给pThreadStartRoutine
类似的东西:
我认识到签名PrivateWorkItem
可能应该更改为:
即使有这种变化,也没有喜悦。VS2015 真的很讨厌我使用bind()
.
我的任务应该是什么pThreadStartRoutine
样的?
c# - ThreadPool.QueueUserWorkItem,退出的线程有代码 0 (0x0)
你好,
我是线程池使用的新手,并通过在 row*col 乘法上使用线程池(ThreadPool.QueueUserWorkItem。)在 c# 上进行矩阵乘法。当我使用矩阵 {1 2 3 4; 执行我的代码时 0 0 2 4} 和 {1 4, 1 5, 3 6, 4,7} 它返回我作为输出:
0,0 = 28 1,0 = 22 线程 0x179c 已退出,代码为 0 (0x0)。线程 0x1fd4 以代码 0 (0x0) 退出。
所以它计算前两个线程并无限循环等待;我不知道为什么。