为什么异步方法在我的 VSTO 加载项中花费 30 倍的时间 运行

Why is an Async Method Taking 30x Longer to Run in my VSTO Add-in

我有一个正在使用的 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(); });
}

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

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