Что делать с медленной офисной надстройкой?

Я разрабатываю надстройку для Outlook, и у меня нет с этим опыта.

Надстройка вызывает некоторые веб-службы для заполнения раскрывающихся списков на ленте, и при выборе элемента в раскрывающемся списке почта отправляется в веб-службу для обработки. Все это работает, но очень медленно при запуске 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);
}

ЛентаMail.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 и две секунды между концом ThisAddIn_Startup и началом загрузки ленты?

Добавлено после ответа Траубенфукса. Я удалил NLog, чтобы проверить, была ли проблема в нем. Я удалил вызов CreateRibbonExtensibilityObject() в ThisAddIn_StartUp (который, по-видимому, был излишним). 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() });
}

ЛентаMail.cs:

private void Ribbon1_Load(object sender, RibbonUIEventArgs e)
{
    new System.Threading.Thread(() =>
    {
        InitializeRibbon();
    }).Start();
}

Я даже пытался удалить ссылки на AutoFac и общую DLL, закомментировать каждую строку кода и удалить все конфигурации в app.config. Для запуска по-прежнему требуется около 650-750 мс.

Любые предложения относительно того, что может вызвать эту проблему?


person Claus Pedersen    schedule 19.11.2013    source источник


Ответы (1)


Я могу предложить вам решение одним словом: потоки.
Запрограммируйте свою надстройку с помощью потоков, особенно любых процедур запуска, и включите взаимодействие с пользователем в конце потока запуска. (Это может быть простое глобальное логическое значение addinReady, которое проверяется при взаимодействии с пользователем, делегат (указатель метода), делающий пользовательские элементы видимыми и т. д.

Это самый простой способ создать новую нить. Думайте об этом, как о расходящихся железных дорогах...

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

Другой способ использования Thread:

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

Возможно, вы захотите использовать метод init() в RibbonMail.cs или даже отдельные части вашей инициализации.

person ASA    schedule 19.11.2013
comment
Спасибо, это изменило ситуацию. Мне все еще интересно узнать о других хитростях, так как он все еще очень медленно запускается. Сколько времени я должен ожидать, чтобы запустить .NET-framework? Могу ли я что-нибудь сделать, чтобы избежать этого? - person Claus Pedersen; 20.11.2013
comment
На моем компьютере программа C# из 4000 строк запускается за ‹1 с. Вы уверены, что боретесь с производительностью запуска .net? Я считаю, что, вероятно, ваш код медленный. Установите точку останова на самой ранней строке кода, которую вы можете. Как только он ломается, любой запуск .net по существу заканчивается. Чтобы обнаружить блоки, которые занимают слишком много времени, я использовал класс «Секундомер», чтобы сузить список того, что занимает так много времени, и исправить это. Время запуска Outlook все еще влияет? Если все сделано правильно, надстройки Outlook не должны увеличивать время запуска Outlook ни на одну секунду. - person ASA; 20.11.2013