Я использую С# для записи приложений Windows с помощью платформы .NET. Как уменьшить время запуска для этих приложений? Мои приложения очень медленны во время запуска и инициализации, особенно при показе исходной формы.
Мое приложение работает с базой данных Access (MDB) для сохранения данных. В некоторых формах он загружает данные, но в первый раз, когда приложение показывает какую-либо форму, для отображения требуется много времени.
Я попытался использовать NGen, чтобы уменьшить время запуска, но это не помогло мне, как ожидалось.
Вы можете использовать EQATEC Profiler, чтобы профилировать ваше приложение и видеть, какие вызовы функций занимают много времени. Это немного облегчает визуализацию того, что происходит в фоновом режиме и где могут быть сделаны улучшения.
Убедитесь, что ваше приложение делает как можно меньше работы при запуске.
Вы можете изменить свой код запуска, чтобы отложить задачи запуска до вторичного потока.
Я бы дал более подробный ответ, но ваш вопрос очень широкий и недостаточно подробный.
Посмотрите на ленивую загрузку. Это связано с загрузкой данных и заполнением класса при первом запросе данных, а не при создании экземпляра класса.
// member variable
private DataSet _employeeDataSet = null;
// property
public DataSet EmployeeDataSet
{
get
{
if (_employeeDataSet == null)
_employeeDataSet = GetEmployeeDataSet();
return _employeeDataSet;
}
}
Сначала вам нужно диагностировать, какие функции работают в течение этого периода запуска, и проанализировать, сколько задержки запуска каждая из функций потребляет...
Затем, как только вы узнаете, что если один или два из них потребляют большую часть времени и не используют первоначально отображаемые экраны пользовательского интерфейса, выполните эти функции в отдельном потоке.
В этой статье MSDN есть много полезных советов, особенно для приложений .NET 2.0.
Самое полезное, что я узнал о том, что недостаточно для вызова SuspendLayout() / ResumeLayout()
в родительской форме, вам может потребоваться вызвать BeginUpdate() / EndUpdate()
для дочерних элементов управления, которые содержат много дочерних объектов (например, деревья или в моем случае Infragistics ToolbarManagers). Используя Begin / EndUpdate
, на моем ToolbarManager вырезано 3 секунды с момента запуска!
Я нахожусь в команде, создающей .NET-приложение на С#, и мы сталкиваемся с этим все время. Существует профилировщик, но никто не хочет его использовать, потому что 1) это немного беспокоит, и 2) выход запутан. То, что я делаю, это запустить его в среде IDE, и пока он работает медленно, я просто приостанавливаю его и спрашиваю, что он делает, и почему, исследуя стек вызовов.
Поскольку он медленнее, чем будет, это потому, что он выполняет некоторые действия, которые будут удалены или сделаны по-другому. Эти вещи обычно состоят из вызовов функций, запрашивающих такие вещи, как: интернационализация строк, которые не нуждаются в интернационализации, загрузка вещей несколько раз, инициализация структур данных, которые есть только для полноты и которые будут заменены позже, разархивировать и закрепить вещи больше, чем необходимо. Все они принимают форму вызовов функций/методов в середине стека, и когда они появляются на нескольких образцах стека, просто кричат, чтобы их посещали.
Хорошо попытаться предвидеть эти проблемы и не вставлять их, но вы можете рассчитывать на такие проблемы, ползучие, несмотря на лучшие намерения. Метод выборки стека (stackshots) эффективен при их поиске.