【问题标题】:C# Word Add-In Custom TaskPane Background worker speed issueC# Word 加载项自定义 TaskPane 后台工作人员速度问题
【发布时间】:2015-04-18 15:17:38
【问题描述】:

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

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

当我们尝试实现取消按钮时,问题就来了。为此,我尝试使用后台工作人员。一切正常......除了从线程(后台工作人员)与文档通信时,它比从主线程运行时慢大约 7-8 倍。我一直无法找到这方面的太多信息,任何建议或帮助将不胜感激。

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

谢谢


举个例子:

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

调用 private void btnRun_Click

这反过来又会触发后台工作程序 backgroundWorker1.RunWorkerAsync();

在后台worker的do work方法中,我有这样的代码:

myClass.Method()

在 myClass 中会有一行代码,例如:

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

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

【问题讨论】:

  • 不看代码就很难说为什么它慢了。您可能正在执行许多在前台线程中运行操作时不存在的跨线程调用,或者任何其他原因。没有看到代码,很难告诉你如何解决这个问题。
  • 感谢您回答罗恩。基本上,速度较慢的部分是访问 word 文档的任何代码行。我会用一个例子来修改我上面的帖子
  • 您是否尝试过使用分析器来查看最耗时的调用在哪里?

标签: c# background com ms-word backgroundworker


【解决方案1】:

那是因为后台线程运行的是一个不同于 Word 的 STA 的 COM 单元。

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

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

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

  1. 显示您的窗口,例如Word 作为拥有窗口,并确保它具有焦点
  2. 禁用拥有的窗口

完成处理后:

  1. 启用拥有窗口
  2. 关上你的窗口

不要在任一阶段的第 1 步和第 2 步之间发送消息。

【讨论】:

    猜你喜欢
    • 2015-12-07
    • 1970-01-01
    • 2018-06-02
    • 1970-01-01
    • 1970-01-01
    • 2011-01-13
    • 1970-01-01
    相关资源
    最近更新 更多