Подтвердить что ты не робот

Настройка веб-приложения С#: PerformWaitCallback

Я использую dotTrace Performance 4.5 для создания веб-приложения .NET 3.5 С#. Когда я записываю один "запрос пользователя" (загрузка страницы), я вижу 11 потоков с примерно одинаковым временем, 7644 мс.

  • Большинство описаний потоков содержат: 100% [Исходный или оптимизированный код] - 7644 мс
  • Говорят: 100% Microsoft.VisualStudio.WebServer.WebServerApp.Main(String[])
  • Последнее:
    • 86% System.Threading._ThreadPoolWaitCallback.PerformWaitCallback(Object)
    • 14% PerformWaitCallback (1094 мс) → 12% = ProcessRequest

Можете ли вы сказать мне:

  • Почему так много потоков? (ресурсы изображений, AJAX, JavaScript)
  • Что такое PerformWaitCallback?
  • Почему 7644 мс всего за 1094 мс работы?
4b9b3361

Ответ 1

Относительно PerformWaitCallback это то, что должен сказать исходный источник:

Вспомогательный вызов. Эта функция отправляет запросы на пользовательские функции обратного вызова. Рабочие элементы извлекаются из каждого приложения очереди в цикле до тех пор, пока не будет больше работы, или квант истекший. Квант применяется для поддержания справедливости среди AppDomains.

Здесь вы можете увидеть полный код здесь.

Кстати, я не уверен, что вы увидите это в .NET 4.5 - снова из исходного источника (не можете найти онлайн-версию, вам придется загрузить его из http://referencesource.microsoft.com/):

//This type is necessary because VS 2010 debugger looks for a method named 
///_ThreadPoolWaitCallbacck.PerformWaitCallback 
//on the stack to determine if a thread is a ThreadPool thread or not.  
//We have a better way to do this for .NET 4.5, but
//still need to maintain compatibility with VS 2010.  
//When compat with VS 2010 is no longer an issue, this type may be removed.
internal static class _ThreadPoolWaitCallback
{ 
    [System.Security.SecurityCritical]
    static internal bool PerformWaitCallback() 
    { 
        return ThreadPoolWorkQueue.Dispatch();
    } 
}

Ответ 2

Почему так много потоков? (ресурсы изображений, AJAX, JavaScript)

Веб-сервер создает пул потоков для управления входящими запросами, и в пуле есть несколько потоков.

Что такое PerformWaitCallback?

Не знаю точно, но он выглядит как код, который ждет, когда поток пула потоков выполнит свою задачу.

Почему 7644 мс всего за 1094 мс работы?

Похоже, что профайлер подсчитывает время, затрачиваемое некоторыми потоками на ожидание новой работы. Я не использовал dotTrace, но у большинства профилировщиков есть способ настроить их, чтобы они могли идентифицировать, когда потоки ждут против работы - на основе информации, которую вы опубликовали, я подозреваю, что профилировщик не настроен правильно.