C#Word加载项自定义任务窗格Backgroundworker速度问题

时间:2015-04-18 15:17:38

标签: c# background com ms-word backgroundworker

我有一个单词加载项,用C#编写。当用户从功能区中选择一个选项时,应用程序(Word)中将打开一个自定义任务窗格(用户控件)。

在此任务窗格中,他们按下运行,并以一系列相当复杂的方式分析活动文档。检查,例如询问文档中的任何粗体文本等等。运行整个过程可能需要5秒到1分钟,具体取决于文档。这很好,没有人对此有任何疑问。

当我们尝试实施取消按钮时出现问题。为此,我尝试使用后台工作程序。一切正常....除了当从线程(后台工作者)与文档进行通信时,它比从主线程运行时慢大约7-8倍。我无法找到关于此的更多信息,我们将非常感谢任何建议或帮助。

我尝试过其他途径(打开xml),但这些不是可行的选项(我们必须处理.doc和.docx)

由于


举个例子:

我在任务窗格上有一个按钮(运行)。

调用private void btnRun_Click

反过来,它会阻止后台工作者backgroundWorker1.RunWorkerAsync();

在后台工作者的do work方法中,我有以下代码:

myClass.Method()

在myClass中将是一行代码,例如:

对于ActiveDocument.Fields中的每个Word.Field

例如,从主按钮单击线程运行可能需要1秒,而从后台工作程序运行最多需要30秒。所有其他代码都能及时运行,只有代码可以访问似乎有问题的Word文档

1 个答案:

答案 0 :(得分:0)

那是因为后台线程正在运行的是与Word的STA不同的COM公寓。

您可能需要考虑的另一种方法是显示对话框,然后在同一个线程中继续处理,不时地抽取Windows消息(例如,在较长的,可能是嵌套的循环的开头)。

当用户按下按钮时,您设置一个标志,您应该在整个代码中定期检查(可能就在您处理消息的地方之后)。

您可能需要自己实施UI模式:

  1. 显示您的窗口,例如Word作为拥有窗口,并确保它是专注的
  2. 禁用拥有窗口
  3. 完成处理后:

    1. 启用拥有窗口
    2. 关闭窗口
    3. 不要在任何阶段的步骤1和2之间抽取消息。