Как я могу получить информацию о загрузке процессора и / или оперативной памяти для * ПОТОКА * в C # (управляемый код)?
-
06-09-2019 - |
Вопрос
Я знаю, как получить загрузку процессора и памяти для процесса, но мне было интересно, как получить это на уровне каждого потока.Если лучшим решением является выполнение некоторого P-вызова, то это тоже нормально.
Пример того, что мне нужно:
Thread myThread = Thread.CurrentThread;
// some time later in some other function...
Console.WriteLine(GetThreadSpecificCpuUsage(myThread));
Решение
Вот пример, который делает то, что вы хотите http://www.codeproject.com/KB/system/processescpuusage.aspx
Другие советы
Как уже было сказано, на вопрос об использовании памяти ответить невозможно, поскольку это атрибут процесса в целом, но использование процессора:
Process p = Process.GetCurrentProcess(); // getting current running process of the app
foreach (ProcessThread pt in p.Threads)
{
// use pt.Id / pt.TotalProcessorTime / pt.UserProcessorTime / pt.PrivilegedProcessorTime
}
Вы не можете получить информацию об использовании памяти для каждого потока, потому что память является общей для всех потоков в процессе.Как ОПЕРАЦИОННАЯ система узнает, выделили ли вы память в одном потоке и использовали ли ее в другом?И что бы это значило?
Вот простая программа, которая запускает 5 потоков, которые потребляют разное количество ЦП, а затем сопоставляет, какой управляемый поток потребляет какое количество ЦП.
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Threading;
class Program
{
[DllImport("Kernel32", EntryPoint = "GetCurrentThreadId", ExactSpelling = true)]
public static extern Int32 GetCurrentWin32ThreadId();
static void Main(string[] args)
{
Dictionary<int, Thread> threads = new Dictionary<int, Thread>();
// Launch the threads
for (int i = 0; i < 5; i++)
{
Thread cpuThread = new Thread((start) =>
{
lock (threads)
{
threads.Add(GetCurrentWin32ThreadId(), Thread.CurrentThread);
}
ConsumeCPU(20 * (int)start);
});
cpuThread.Name = "T" + i;
cpuThread.Start(i);
}
// Every second wake up and see how much CPU each thread is using.
Thread monitoringThread = new Thread(() =>
{
Stopwatch watch = new Stopwatch();
watch.Start();
while (true)
{
Thread.Sleep(1000);
Console.Write("\r");
double totalTime = ((double)watch.ElapsedMilliseconds);
if (totalTime > 0)
{
Process p = Process.GetCurrentProcess();
foreach (ProcessThread pt in p.Threads)
{
Thread managedThread;
if (threads.TryGetValue(pt.Id, out managedThread))
{
double percent = (pt.TotalProcessorTime.TotalMilliseconds / totalTime);
Console.Write("{0}-{1:0.00} ", managedThread.Name, percent);
}
}
}
}
});
monitoringThread.Start();
}
// Helper function that generates a percentage of CPU usage
public static void ConsumeCPU(int percentage)
{
Stopwatch watch = new Stopwatch();
watch.Start();
while (true)
{
if (watch.ElapsedMilliseconds > percentage)
{
Thread.Sleep(100 - percentage);
watch.Reset();
watch.Start();
}
}
}
}
Обратите внимание, что возможно, что среда CLR изменит собственный поток, под управлением которого выполняется управляемый поток.Однако на практике я не уверен, как часто это происходит на самом деле.