Как предварительно загрузить библиотеки классов в Dot Net Compact Framework? - PullRequest
2 голосов
/ 20 июля 2010

Допустим, я загружаю Form1, а затем отображаются кнопки, которые позволяют мне получить доступ к формам 2,3 и 4.

Теперь, когда я нажимаю кнопку, чтобы загрузить Form2, я вижу, что это занимает немноговремя для загрузки нескольких библиотек классов (.dll), что заставляет пользовательский интерфейс не отвечать на запросы.

Я не вижу форму, пока не загружены библиотеки классов, что заставляет Form1 отображаться до тех пор, пока не будут загружены библиотеки.Но после этого это довольно быстро.

Итак, как мне предварительно загрузить библиотеки классов, возможно, при запуске приложения?

Я попытался поместить операторы using в Form1, и компактная структура настолько хороша, что онане будет загружаться, пока это на самом деле не требуется Form2.Я говорю о 2 секундах задержки, но все равно выглядит плохо.

Есть ли способ решить эту проблему?Не могу ли я заставить CF загрузить файл моей dll, он загружает System.dll, System.Windows.Forms.dll и т. Д.?

ОБНОВЛЕНИЕ:

Я мог бы загрузить свои собственные библиотеки классов, используя Assembly.LoadFrom но я все еще не могу загрузить следующие файлы при загрузке Form1

Microsoft.WindowsMobile.PocketOutlook.dll
Microsoft.WindowsCE.Forms.dll
Microsoft.WindowsMobile.Utilities.dll
System.Xml.dll

Это дажевозможный?:)

1 Ответ

2 голосов
/ 20 июля 2010

Речь идет не о «загрузке библиотеки классов», а о том, какой код должен быть JITted (среда выполнения, скомпилированная из IL в машинный код).Когда вы в первый раз показываете свою форму, среда выполнения должна JIT весь код для создания экземпляров вашего класса.Он также должен запускать конструктор и т. Д. В последующее время он может показывать только форму, и даже если ему нужно загрузить новый экземпляр, код JITted может быть уже кэширован и готов к запуску, что означает, что компиляция не требуется.

Чтобы получить наилучшую «видимую» производительность, вы должны сохранить количество JITting, необходимое, когда пользователь нажимает кнопку до минимума.Если вашей Форме понадобятся некоторые службы или объекты, предварительно загрузите их в фоновом потоке, чтобы они были готовы тогда, когда они нужны Форме.

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

Редактировать

Это может выглядеть примерно так:

class MyForm
{
    static void Main()
    {
        new Thread(delegate
            {
                AppInitialize();
            })
            {
                IsBackground = true
            }
            .Start();

        Application.Run(new MyForm());
    }

    static void AppInitialize()
    {
       // load app-wide resources, services, etc
    }

    public MyForm()
    {
        InitializeComponent();

        ThreadPool.QueueUserWorkItem(
            delegate
            {
                InitializeServices();
            });
    }

    void InitializeServices()
    {
        // load up stuff the Form will need after loading/first rendering
    }
}

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

...