Асинхронная операция надстройки Word 2007 - PullRequest
0 голосов
/ 20 апреля 2011

Я пытаюсь создать надстройку Word (Word 2007, VS 2008) для получения различной статистики для длинных текстов. Функции для вычисления статистики находятся в отдельном классе и не сложны, но занимают много времени. Расчеты начинаются с кнопки настраиваемой панели задач в моей надстройке и представляются в элементе управления DataGridView в том же CTP-файле после завершения. Это работает хорошо, за исключением того, что Word блокируется во время выполнения расчетов. Для длинных текстов это может занять время (например, ~ 10 секунд для документа на 800 сотен страниц). Я читал несколько предыдущих тем по этой проблеме и пытался использовать BackgroundWorker, но это не помогло - Word по-прежнему заблокирован. Вот мой текущий код:

        private void btnAnalyze_Click(object sender, EventArgs e)
    {
        worker.RunWorkerAsync();
    } 

    private void worker_DoWork(object sender, DoWorkEventArgs e)
    {
        e.Result = Tools.CalculateStatistics(
            Globals.ThisAddIn.Application.ActiveDocument.Content.Text,
            statOptions);
    }

    private void worker_RunWorkerCompleted(
        object sender, RunWorkerCompletedEventArgs e)
    {
        gridResults.BeginInvoke(
            new GridDelegate(RefreshGrid),
            e.Result as List<Tools.StatResults>);
    }

    private void RefreshGrid(List<Tools.StatResults> list)
    {
        statList = list;
        gridResults.DataSource = statList;
        gridResults.Refresh();
    }

работник - это объект BackgroundWorker, gridResults - это элемент управления DataGridView, statList - это общий список, который является источником данных для DataGridView. (это приватный участник моего надстройки usercontrol)

1 Ответ

0 голосов
/ 21 апреля 2011

Я еще не пробовал использовать поток в Word. Последняя статья, о которой я читал, была связана с Outlook, но я думаю, что стоит взглянуть на комментарий Кена Словацкого относительно тем 64-разрядная надстройка Outlook 2010 - сбой при создании другого потока .

...