2011-12-22 2 views
3

Windows Taskmanger отлично подходит для использования процессора и памяти приложения, но в нашей программе у нас разные потоки, и мы хотим знать, сколько общего количества приходится на каждый поток.C#: загрузка рабочей нагрузки и использование памяти

Мы хотели бы проверить это с помощью внешней программы, а также самого приложения во время выполнения. Было бы здорово, если бы поток мог рассказать о его памяти и использовании процессора.

ответ

-1

Объекты разделяются между потоками, потоки не принадлежат объектам.

Память для объекта выделяется на кучу, которая живет в царстве приложения. Любой поток может получить доступ к любой из этих данных в любое время в течение всего срока службы приложения.

Невозможно определить, какой поток является или может использовать любые произвольные блоки памяти.

Резьба выполняет единицы измерения. Если вы не знаете, какой поток будет запускать какую единицу работы, вы не сможете получить надежных показателей из использования ЦП. Если вы знаете, какой поток будет выполнять какие задачи, то Process Explorer от SysInternals имеет этот показатель.

+0

Не могли бы вы это разъяснить? Я не уверен, что понимаю. – Groo

+0

Это неправда. Использование памяти можно отследить до распределения по конкретным потокам в C#, а использование ЦП, безусловно, поддается измерению в потоке. – Polynomial

+0

@Полиномиальный не надежно или последовательно, ни что-нибудь отдаленно полезное. Рассмотрим статические переменные, поток, который создал объекты, может быть удален из пула потоков, и все же память все еще живет! Примечателен. Пожалуйста, удалите ваш downvote. –

0

Вы можете использовать монитор производительности, чтобы узнать, сколько памяти выделено процессу, но вы не можете видеть то же самое для отдельных потоков внутри него.

Однако вы можете создать пользовательский performance counters, чтобы отобразить любое значение, которое вы хотите отслеживать, из вашего кода.

0

SysInternals Process Explorer имеет эту функцию, проверьте this Server fault thread.

Существует проект с открытым исходным кодом на CodeProject, скриншот выглядит многообещающим: How to get CPU usage of processes and threads, но демонстрационный проект, похоже, сбой на Win7 (возможно, некоторые привилегии).

[Редактировать] Если вы хотите написать его самостоятельно, вы можете P/Invoke Thread32First и Thread32Next функции перечислить темы, в рамках одного процесса, а затем использовать QueryThreadCycleTime для запроса процессорного времени для каждого потока.

1

Вот пример: У вас есть threadA и ThreadB. ThreadA создает объект X. ThreadB использует этот объект. Итак, что вы хотите увидеть в информации о потоке? Кто создал объект или кто его использует? Единственное, что вы можете видеть, это то, сколько времени процессора использует поток AFAIK И все-таки единственная программа, которую я знаю, которая показывает MAX-информацию о процессе, это Process Explorer. http://technet.microsoft.com/en-us/sysinternals/bb896653

+1

Это больше похоже на комментарий к вопросу, чем на ответ. –

+0

Хорошо, добавлена ​​дополнительная информация и возможное решение. – Elastep

+1

Нет, это basicalyl говорит, что это невозможно. ЕДИНСТВЕННАЯ память выделяет TO THREAD - это STACK. Все остальное разделяют. – TomTom

Смежные вопросы