如何在Dot Net Compact Framework中预加载类库?

时间:2010-07-20 08:02:38

标签: c# dll windows-mobile compact-framework load

让我说我加载Form1然后它显示按钮,让我访问表格2,3和4。

现在,当我单击按钮加载Form2时,我可以看到加载一些类库(.dll)需要一些时间,这会使UI看起来没有响应。

在加载类库之前,我没有看到该表单,这使得在加载库之前仍然会显示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 个答案:

答案 0 :(得分:2)

这不是关于“加载类库”,而是关于需要JIT的代码(运行时从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容器框架,所以我的代码看起来很不一样。从根本上说,我使用相同的概念。