C#:线程工作负载和内存使用

C#:线程工作负载和内存使用,c#,multithreading,C#,Multithreading,Windows Taskmanger可以检查应用程序的CPU和内存使用情况,但是在我们的程序中,我们有不同的线程,我们想知道每个线程上有多少总的内存 我们希望在运行时通过外部程序以及应用程序本身来检查这一点。如果一个线程能够说出他的内存和cpu使用情况,那就太好了。对象在线程之间共享,线程不拥有对象 对象的内存在堆上分配,堆位于应用程序的领域中。任何线程都可以在应用程序生命周期内的任何时间访问该内存 无法确定哪个线程正在或可能正在使用任意内存块 线程执行工作单元。除非您知道哪个线程将运行哪个工作

Windows Taskmanger可以检查应用程序的CPU和内存使用情况,但是在我们的程序中,我们有不同的线程,我们想知道每个线程上有多少总的内存


我们希望在运行时通过外部程序以及应用程序本身来检查这一点。如果一个线程能够说出他的内存和cpu使用情况,那就太好了。

对象在线程之间共享,线程不拥有对象

对象的内存在堆上分配,堆位于应用程序的领域中。任何线程都可以在应用程序生命周期内的任何时间访问该内存

无法确定哪个线程正在或可能正在使用任意内存块


线程执行工作单元。除非您知道哪个线程将运行哪个工作单元,否则您将无法从CPU使用率中获得可靠的指标。如果您确实知道哪个线程将执行哪些任务,那么by SysInternals具有此度量。

您可以使用性能监视器查看分配给进程的内存量,但对于其中的单个线程,您无法看到相同的情况

但是,您可以创建自定义以显示代码中要监视的任何值。

有此功能,请选中

CodeProject上有一个开源项目,截图看起来很有希望,但是演示项目似乎在Win7上崩溃了(可能缺少一些特权)

[编辑]如果您想自己编写,您可以p/调用和函数来枚举单个进程中的线程,然后使用来查询每个线程的CPU时间。

以下是示例: 你有threadA和ThreadB。 ThreadA创建一个对象X。 ThreadB使用此对象。 那么,您希望在线程的信息中看到什么呢?谁创建了该对象或谁正在使用它? 您唯一能看到的是使用线程AFAIK的CPU时间
尽管如此,我所知道的唯一一个显示流程最大信息的程序是process Explorer

这看起来更像是对问题的评论,而不是回答。好吧,添加了更多信息和可能的解决方案。不,基本上说这是不可能的。分配给线程的唯一内存是堆栈。那么,如果线程A分配了一个1MB的缓冲区,用数据填充它,并将其排队给线程B,而线程B已经收到它并正在处理它,那么谁“拥有”了缓冲区?A分配了它,但B正在使用它,完成后将释放它。这个答案不值得投反对票。@rich.okelly-关键是为了诊断目的,跟踪特定线程的内存分配很容易,这是识别内存泄漏的良好第一步。我不打算取消否决票,因为我相信你给出的答案是错误的。你也没有完全回答这个问题,因为这个问题问的是CPU使用率和内存使用率。@MartinJames-你是对的,没有线程拥有的内存,但所有内存都是由线程分配的。如果您可以跟踪一个线程分配了多少内存,以及它是否在任何时间点被释放(您可以这样做),那么您就可以大致了解一个线程有多“泄漏”,或者至少它对内存使用的影响有多大。@Martin James您真的回答“是”吗“当你妻子问你要喝茶还是咖啡时,你会问她吗?”蝉-有时,但她会用茶壶打我。