Я пытался сделать то же самое ... узнать, сколько процессора потребляет конкретный поток.В следующем коде я могу определить текущий поток, в котором выполняется WorkHard.Однако переменные intitialTicks и finalTicks имеют currentProcessThread.TotalProcessorTime.Ticks до и после выполнения сложной для вычисления функции, но обе имеют одно и то же значение, поэтому разница равна нулю
public void WorkHard()
{
long initialTicks, finalTicks, deltaTicks;
byte f;
bool threadFound;
ProcessThreadCollection currentProcessThreads;
ProcessThread currentProcessThread = null;
int m_currentThreadId = kernel32.GetCurrentThreadId();
while (m_keepWorking)
{
f = (byte)rnd.Next(31);
System.Threading.Thread.Sleep(f*25);
threadFound = false;
currentProcessThreads = Process.GetCurrentProcess().Threads;
foreach (ProcessThread t in currentProcessThreads)
{
if (t.Id == m_currentThreadId)
{
currentProcessThread = t;
threadFound = true;
break;
}
}
initialTicks = threadFound ? currentProcessThread.TotalProcessorTime.Ticks : 0;
fibonacci(f);
finalTicks = threadFound ? currentProcessThread.TotalProcessorTime.Ticks : 0;
deltaTicks = finalTicks - initialTicks;
lock (workerLogFile.BaseStream)
{
workerLogFile.WriteLine(string.Concat(m_minionName, " finished calculating fib(", f.ToString(), ") at ", DateTime.Now.ToString("yyyy.MM.dd HH:mm:ss.ffff"), " on threadId[", m_currentThreadId.ToString(), "]. Process required ", finalTicks.ToString()," - ", initialTicks.ToString()," = ", deltaTicks.ToString(), " ticks"));
}
OnMinionDoneEvent(new minionEventArgs(String.Concat(m_minionName, ", on thread ", m_currentThreadId.ToString("000000"), ", done working on Fibonacci(", f.ToString(), ")"), finalTicks - initialTicks));
}
lock (workerLogFile.BaseStream)
{
workerLogFile.WriteLine(string.Concat(m_minionName, " called to rest at ", DateTime.Now.ToString("yyyy.MM.dd HH:mm:ss.ffff"), " on threadId[", m_currentThreadId.ToString(), "]."));
}