【问题标题】:What to do with slow office addin?如何处理缓慢的办公室插件?
【发布时间】:2013-11-19 07:46:17
【问题描述】:

我正在为 Outlook 开发插件,但对此没有任何经验。

ADDIN正在调用一些Web服务以在功能区中填充下拉框,并且在下拉框中选择项目时,将邮件发送到WebS服务以进行处理。这一切都有效,但是在启动 Outlook 和 Outlook 2013 默认情况下禁用慢速插件时它真的很慢。我能做些什么来加快启动速度?是否可以将初始化移动到另一个事件?

这些是初创公司的亮点:

这个AddIn.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

什么需要这么长时间?这些方法之间会发生什么(例如 BeginInit 结束和 ThisAddIn_Startup 开始之间的 4 秒以及 ThisAddIn_Startup 结束和 Ribbon 加载开始之间的 2 秒?

在 Traubenfuchs 回答后添加 我已删除 NLog 以查看是否是问题所在。我在 ThisAddIn_StartUp 中删除了对 CreateRibbonExtensibilityObject() 的调用(这似乎是多余的)。一个共享代码的 DLL 仍然被加载,我正在使用 AutoFac for IoC。

在这些更改之后,插件在我的开发机器上加载大约需要 750-800 毫秒。但在我的测试机器上,它更像是 4-5 秒。

这就是我的代码现在的样子:

这个AddIn.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 毫秒。

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

【问题讨论】:

    标签: c# outlook ms-office


    【解决方案1】:

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

    这是创建新线程的最简单方法。把它想象成分开的铁路......

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

    线程的另一种使用方式:

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

    您可能更希望在 RibbonMail.cs 中线程化 init() 方法,甚至只是选择初始化部分。

    【讨论】:

    • 谢谢,这有所作为。我仍然有兴趣了解任何其他技巧,因为它的启动速度仍然很慢。预计启动 .NET 框架需要多长时间?我能做些什么来避免这种情况吗?
    • 在我的电脑上,一个 4000 行的 C# 程序在
    猜你喜欢
    • 2017-09-21
    • 1970-01-01
    • 2021-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多