在 VSTO 中使用 async/await 的跨线程操作无效

Cross-thread operation not valid using async/await in VSTO

我得到一个

Cross-thread operation not valid

...以下代码出错。我以为 async/await 会处理这个问题,但显然不会。奇怪的是,当我注释掉 textBoxUser.Enabled = false 时,错误消失了。想法?

private async void buttonPopulate_Click(object sender, EventArgs e)
{
     textBoxUser.Enabled = false;

     await Populate(); 

     textBoxUser.Enabled = true; //error here
}

您的问题可能是由于 VSTO 没有正确提供 SynchronizationContext;这是 Office 插件系统长期存在的问题。您可以通过检查事件处理程序开头的 SynchronizationContext.Current 的值来验证这一点;如果是null,那么就是VSTO的问题。

要解决此问题,您可以在任何 async void 事件处理程序的开头执行此操作:

SynchronizationContext.SetSynchronizationContext(new WindowsFormsSynchronizationContext());