我正在为Outlook开发一个插件,我对此没有任何经验。
插件调用一些web服务来填充功能区中的下拉框,当在下拉框中选择一个项目时,邮件将被发送到Web服务进行处理。这一切都有效,但是在启动Outlook时它确实很慢,而且默认情况下Outlook 2013禁用慢速插件。我可以做些什么来加快启动速度?是否可以将初始化移动到另一个事件?
这些是创业公司的亮点:
ThisAddIn.cs:
private void ThisAddIn_Startup(object sender, System.EventArgs e)
{
_logger.Info("ThisAddIn_Startup begin");
CreateRibbonExtensibilityObject();
_logger.Info("ThisAddIn_Startup end");
}
public override void BeginInit()
{
_logger.Info("BeginInit begin");
var bootstrapper = new Bootstrapper();
bootstrapper.ConfigureOutlookAddIn();
IocContainer.Container = bootstrapper.Container;
base.BeginInit();
_logger.Info("BeginInit end");
}
protected override Microsoft.Office.Core.IRibbonExtensibility CreateRibbonExtensibilityObject()
{
_logger.Info("CreateRibbonExtensibilityObject begin");
Microsoft.Office.Tools.Ribbon.IRibbonExtension[] ribbons = new Microsoft.Office.Tools.Ribbon.IRibbonExtension[] { new RibbonConnectMail() };
_logger.Info("CreateRibbonExtensibilityObject end");
return Globals.Factory.GetRibbonFactory().CreateRibbonManager(ribbons);
}
RibbonMail.cs:
private void Ribbon1_Load(object sender, RibbonUIEventArgs e)
{
_logger.Info("Ribbon load begin");
init();
_logger.Info("Ribbon load end");
}
这是记录的内容:
2013-11-19 08:34:27.0380|INFO|ThisAddIn|CreateRibbonExtensibilityObject begin
2013-11-19 08:34:28.0770|INFO|ThisAddIn|CreateRibbonExtensibilityObject end
2013-11-19 08:34:28.4982|INFO|ThisAddIn|BeginInit begin
2013-11-19 08:34:28.5543|INFO|ThisAddIn|BeginInit end
2013-11-19 08:34:32.0143|INFO|ThisAddIn|ThisAddIn_Startup begin
2013-11-19 08:34:32.0143|INFO|ThisAddIn|CreateRibbonExtensibilityObject begin
2013-11-19 08:34:32.0283|INFO|ThisAddIn|CreateRibbonExtensibilityObject end
2013-11-19 08:34:32.0283|INFO|ThisAddIn|ThisAddIn_Startup end
2013-11-19 08:34:34.2045|INFO|RibbonMail|Ribbon load begin
2013-11-19 08:34:36.4228|INFO|RibbonMail|Ribbon load end
花了这么长时间?这些方法之间会发生什么(f.ex BeginInit结束和ThisAddIn_Startup之间的四秒开始,ThisAddIn_Startup结束和Ribbon加载之间的两秒开始?
在Traubenfuchs回答后添加 我删除了NLog以查看是否存在问题。我已经删除了对ThisAddIn_StartUp中的CreateRibbonExtensibilityObject()的调用(看似多余)。仍然加载了具有共享代码的DLL,我正在使用AutoFac进行IoC。
在这些更改之后,插件在我的开发计算机上加载大约750-800毫秒。但是在我的测试机器上,它更像是4-5秒。
这就是我现在的代码:
ThisAddIn.cs:
private void ThisAddIn_Startup(object sender, System.EventArgs e)
{
}
private void ThisAddIn_Shutdown(object sender, System.EventArgs e)
{
}
protected override Microsoft.Office.Core.IRibbonExtensibility CreateRibbonExtensibilityObject()
{
return Globals.Factory.GetRibbonFactory().CreateRibbonManager(new Microsoft.Office.Tools.Ribbon.IRibbonExtension[] { new RibbonMail() });
}
RibbonMail.cs:
private void Ribbon1_Load(object sender, RibbonUIEventArgs e)
{
new System.Threading.Thread(() =>
{
InitializeRibbon();
}).Start();
}
我甚至尝试删除对AutoFac和共享DLL的引用,注释掉每行代码并删除app.config中的所有配置。它仍然需要大约650-750毫秒才能启动。
有关可能导致此问题的任何建议吗?
答案 0 :(得分:2)
我可以用一个词为您提供解决方案:线程
使用线程编程你的插件,特别是任何启动程序,并在启动线程结束时启用用户交互。 (这可以是一个简单的全局“addinReady”布尔值,用于在用户交互,委托(方法指针)上检查,使用户元素可见等。
这是制作新主题的最简单方法。想想它就像分开铁路......
new System.Threading.Thread(()=>
{
CreateRibbonExtensibilityObject();
}).Start();
使用Thread的另一种方法:
Thread thread = new Thread(CreateRibbonExtensibilityObject);
thread.Start();
您可能更愿意在RibbonMail.cs中创建init()方法,甚至只是初始化的选定部分。