C# Word 2007加载项异步操作

C# Word 2007加载项异步操作,c#,asynchronous,ms-word,vsto,add-in,C#,Asynchronous,Ms Word,Vsto,Add In,我正在尝试创建一个Word插件(Word 2007,VS 2008),以获取长文本的各种统计数据。用于计算统计数据的函数位于单独的类中,并不复杂,但非常耗时。计算从“我的加载项”中的自定义任务窗格按钮开始,完成后在同一CTP中的DataGridView控件中显示。这很有效,除了在执行计算时阻止Word之外。对于长文本,这可能需要时间(例如,对于800页的文档,大约需要10秒)。我已经阅读了一些关于这个问题的文章,并试图使用BackgroundWorker,但这没有帮助-Word仍然被阻止。这是我

我正在尝试创建一个Word插件(Word 2007,VS 2008),以获取长文本的各种统计数据。用于计算统计数据的函数位于单独的类中,并不复杂,但非常耗时。计算从“我的加载项”中的自定义任务窗格按钮开始,完成后在同一CTP中的DataGridView控件中显示。这很有效,除了在执行计算时阻止Word之外。对于长文本,这可能需要时间(例如,对于800页的文档,大约需要10秒)。我已经阅读了一些关于这个问题的文章,并试图使用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();
    }
private void btnAnalyze\u单击(对象发送者,事件参数)
{
worker.RunWorkerAsync();
} 
私有void worker_DoWork(对象发送方,DoWorkEventArgs e)
{
e、 结果=Tools.CalculateStatistics(
Globals.ThisAddIn.Application.ActiveDocument.Content.Text,
国家);
}
私有void worker\u runworker已完成(
对象发送器,RunWorkerCompletedEventArgs(e)
{
gridResults.BeginInvoke(
新GridDelegate(刷新网格),
e、 结果(如列表所示);
}
专用void刷新网格(列表)
{
statList=列表;
gridResults.DataSource=statList;
gridResults.Refresh();
}

worker是BackgroundWorker对象,gridResults是DataGridView控件,statList是DataGridView的数据源的通用列表。(它是我的外接程序用户控件的私有成员)

我还没有尝试在Word中使用线程。我读到的最后一篇文章与Outlook有关,但我认为值得一看Ken Slovak关于中线程的评论