为什么异步方法在我的 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
)。
我有一个正在使用的 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
)。