如何处理慢办公室插件?

时间:2013-11-19 07:46:18

标签: c# outlook ms-office

我正在为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毫秒才能启动。

有关可能导致此问题的任何建议吗?

1 个答案:

答案 0 :(得分:2)

我可以用一个词为您提供解决方案:线程 使用线程编程你的插件,特别是任何启动程序,并在启动线程结束时启用用户交互。 (这可以是一个简单的全局“addinReady”布尔值,用于在用户交互,委托(方法指针)上检查,使用户元素可见等。

这是制作新主题的最简单方法。想想它就像分开铁路......

new System.Threading.Thread(()=>
{
    CreateRibbonExtensibilityObject();
}).Start();

使用Thread的另一种方法:

Thread thread = new Thread(CreateRibbonExtensibilityObject);
thread.Start();

您可能更愿意在RibbonMail.cs中创建init()方法,甚至只是初始化的选定部分。