C# 如何运行后台进程以响应VSTO Office加载项中的选择更改事件?

C# 如何运行后台进程以响应VSTO Office加载项中的选择更改事件?,c#,vsto,async-await,C#,Vsto,Async Await,我有一个VSTO应用程序级外接程序,带有自己的自定义任务窗格。我试图截获SelectionChange事件,并在自定义任务窗格中显示与选择相关的信息。我知道如何同步进行 但是,获取要显示的信息的过程很慢,我不想在获取信息时阻止应用程序。此外,用户可能会多次更改选择,如果发生这种情况,我想取消任何正在进行的“获取”操作 我已经尝试等待长时间运行的操作,但由于我没有打开表单,因此在我尝试更新任务窗格上的控件时,就会出现InvalidOperationException(跨线程操作无效) async

我有一个VSTO应用程序级外接程序,带有自己的自定义任务窗格。我试图截获SelectionChange事件,并在自定义任务窗格中显示与选择相关的信息。我知道如何同步进行

但是,获取要显示的信息的过程很慢,我不想在获取信息时阻止应用程序。此外,用户可能会多次更改选择,如果发生这种情况,我想取消任何正在进行的“获取”操作

我已经尝试等待长时间运行的操作,但由于我没有打开表单,因此在我尝试更新任务窗格上的控件时,就会出现InvalidOperationException(跨线程操作无效)

async void Application_WindowSelectionChange(PowerPoint.Selection selection)
{
    var results = await MyLongRunningOperation(cancellationTokenSource.Token);

    myControl.Text = DescribeResults(results); // BOOM!
}
克服这个问题的最好方法是什么?我尝试按照Stephen在上面链接中的建议,将以下内容放在selection changed事件处理程序的开头:

SynchronizationContext.SetSynchronizationContext(new WindowsFormsSynchronizationContext())
那没用。突然,我所有的其他事件处理程序都开始出错,说“在创建句柄之前不能调用BeginInvoke”。我试着在每个事件处理程序的开头都放上相同的代码,以防这是一个全有或全无的交易。那也没用。也许我应该创建一个
WindowsFormsSynchronizationContext
对象,并将其用于所有处理程序,但我知道我现在正在抓紧救命稻草

如果这不起作用,我应该尝试其他什么方法?
BeginInvoke
仍然是一条路要走,还是我可以以其他方式跳转到UI线程

突然,我所有的其他事件处理程序都开始出错,说“在创建句柄之前不能调用BeginInvoke”

这很奇怪。我也在抓救命稻草,但试试这个:

Control control = new Control();
IntPtr handle = control.Handle;
而不是直接调用SynchronizationContext.SetSynchronizationContext。您可能需要在每次活动开始时这样做


(想法来源于)。

在初始化代码期间,尝试在前面设置同步上下文。或者,仅当当前同步上下文为空时,才包装上下文设置。谢谢。似乎我可以在第一次
等待
之前立即这样做。我只需要在尚未创建表单的事件处理程序中执行此操作。