让我说我加载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
甚至可能吗? :)
答案 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容器框架,所以我的代码看起来很不一样。从根本上说,我使用相同的概念。