在工作中,我们使用DevExpress作为用户界面。第一次打开使用DevExpress控件的表单会有很长的停顿时间(某些客户端有时会持续15-20秒)。在Visual Studio中,我可以看到在该阶段正在加载大量的程序集。有没有办法在生成的线程中将该程序集预加载到后台的AppDomain中,例如在登录屏幕弹出之前?
答案 0 :(得分:4)
另一种选择是强制JIT加载程序集异步而不是手动执行。诀窍是简单地调用控件的构造函数,因此Jit知道它必须开始编译该特定的代码路径。通常会强制它加载所有依赖程序集。只需确保通过try catch包围构造函数的调用。
如何在加载时执行此操作的示例:
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
PreJitControls();
Application.Run(new Form1());
}
private static void PreJitControls()
{
ThreadPool.QueueUserWorkItem((t) =>
{
Thread.Sleep(1000); // Or whatever reasonable amount of time
try
{
AssemblyPullingControl1 c = new AssemblyPullingControl1();
}
catch (Exception) { }
try
{
AssemblyPullingControl2 c = new AssemblyPullingControl2();
}
catch (Exception) { }
});
}
}
但是你也可以在登录表单的构造函数中做类似的事情,如果这是更好的时间进行预加载。只需将PreJitControls方法移动到登录表单并从构造函数中调用它。
答案 1 :(得分:2)
然而,这会强制您的用户在启动时始终接受该命中。
一般来说,这是一个坏主意(如果你的命中至少推迟它,直到你真的需要它)。可能有帮助的情况是,如果很有可能在不久的将来 使用该功能但系统处于空闲状态,则会触发负载。但这可能很难做到准确。
您可能会看到是否有任何已加载的程序集在您的控制之下和GAC中。如果是这样,你可能会对它们产生影响,这可能会对你UI的这个方面的启动时间产生重大影响。
答案 2 :(得分:1)
我不确定,但我猜测并不是程序集的实际加载是耗时的部分 - 但可能是代码路径的JIT编译。也许你想看看ngen。可能会导致性能问题消失。但一定要了解该工具的含义。
链接: - http://msdn.microsoft.com/en-us/library/6t9t5wcf.aspx - http://msdn.microsoft.com/en-us/magazine/cc163610.aspx
答案 3 :(得分:0)
查看Assembly.Load方法。
格罗
答案 4 :(得分:0)
如果您想提高装配速度,为什么不在NGEN上查看代码。预JIT后台的一切。虽然取决于你的应用程序正在做什么,但这有赞成和反对意见。