在.NET线程中花了多少时间?

我有一个带有(4)线程的multithreading应用程序我想知道在线程中花费了多少处理时间。 我用ThreadPool创建了所有这些线程

Thread1做job1
Thread2做job2
..
..

结果将是:
Thread1在12毫秒内运行
Thread2在20毫秒内运行

我实际上是在一个作业中下载一个网页,每个作业在一个线程中处理我想知道网页下载需要多少时间(没有其他线程上下文切换对计算时间的影响)

我在codeproject上找到了这段代码:

http://www.codeproject.com/KB/dotnet/ExecutionStopwatch.aspx

试试并报告;)

如果你想获得秒表的总时间,那就是秒表类:

Stopwatch sw = Stopwatch.StartNew(); // execute code sw.Stop(); // read and report on sw.ElapsedMilliseconds 

如果要查找线程实际执行代码的时间(而不是等待I / O等),可以通过枚举应用程序的Process对象的线程来检查ProcessThread.TotalProcessorTime属性。

请注意,线程池中的线程在使用后不会被销毁,而是留在池中以便重用,这意味着线程的总时间包括它在当前工作负载之前完成的所有操作。

WMI类Win32_Thared包含属性KernelModeTimeUserModeTime ,如果可用,它将为您提供100ns实际执行单位的计数。

但是,从文档 :

如果此信息不可用,则应使用值0(零)。

因此,这可能取决于操作系统(在Win7上肯定会填充)。

查询如: select * from win32_thread where ProcessHandle="x"将获取进程id xWin32_Thread实例(忽略名称中的“handle”)。 例如,使用PowerShell,查看自己的线程:

 PS[64bit] > gwmi -Query "select * from win32_thread where ProcessHandle=""7064"""| ft -AutoSize Handle,KernelModeTime,UserModeTime Handle KernelModeTime UserModeTime ------ -------------- ------------ 5548 218 312 6620 0 0 6112 0 0 7148 0 15 6888 0 0 7380 0 0 3992 0 0 8372 0 0 644 0 0 1328 0 15 

(并确认这不是经过的时间,过程开始时间是2010-09-30 16:44:50。

无法做到。 问题是,除非你阻止它(很难做到 – 没什么意义)线程可以被智能化。 因此,虽然它要完成THread2 20ms,但你不知道它有多少是活跃的。

什么叫做preemtive多任务处理的消极方面。