【问题标题】:Why is an Async Method Taking 30x Longer to Run in my VSTO Add-in为什么在我的 VSTO 加载项中运行异步方法需要 30 倍的时间
【发布时间】:2021-11-10 23:22:15
【问题描述】:

我正在开发一个 MS Project VSTO 加载项。我创建了一个 WPF 表单,我想在方法运行时单击一个按钮并在 UI 上显示一个不确定的进度条。我可以通过将方法包装在 Task.Run() 中来实现这一点,唯一的问题是异步运行该方法似乎比正常运行慢大约 30 倍。我正在调用的方法与 Office.Interop.MSProject 库中的对象交互,所以我不确定这是导致我的性能问题的 Office 还是 COM。

private async void ButtonClickMethod()
{
    var tar = await RunTraceAnalysisAsync(); 
    // doing this takes ~30 times longer to run than just calling traceToolsController.RunTraceAnalysis() normally
}

private Task<TraceAnalysisResult> RunTraceAnalysisAsync()
{
    return Task.Run(() => { return traceToolsController.RunTraceAnalysis(); });
}

【问题讨论】:

  • RunTraceAnalysisAsync() 的代码是什么样的?
  • 我将它包含在代码 sn-p 中。你想知道tracetoolsController.RunTraceAnalysis() 的代码是什么样的吗?
  • 我对@9​​87654324@ 更感兴趣。 RunTraceAnalysis 已经可以使用了。
  • RunTraceAnalysisAsync() 只是将tracetoolsController.RunTraceAnalysis() 放入Task.Run() 包装器中
  • FWIW 我在 VSTO 加载项中解决进度条的方法是我有一个进度条表单,它有一个调用转发器类,它使用 Type.InvokeMember 来调用特定方法。因此,所有使用进度条的代码都是通过显示该表单并传递要调用的函数名称来启动的。调用转发器是调用实际代码的地方,然后该函数可以在其代码运行时更新进度条。性能没有下降。

标签: c# com vsto office-interop ms-project


【解决方案1】:

根据经验,大多数 Office 应用程序会将对其对象模型方法的调用编组回主线程,这当然是昂贵的。例如,Outlook 在检测到其方法是从 Outlook.exe 进程内的辅助线程使用时引发异常。

尝试批处理所有对象模型调用以在主线程上运行(您可以为此使用Dispatcher)。

【讨论】:

  • 嗯,难怪Office Interop总是那么慢。
猜你喜欢
  • 1970-01-01
  • 2015-02-27
  • 1970-01-01
  • 2021-09-19
  • 2015-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-24
相关资源
最近更新 更多