2017-08-09 91 views
1

我得到一个跨线程操作无效使用异步/等待在VSTO

跨线程操作无效

...错误与下面的代码。我认为异步/等待会照顾这一点,但显然不是。奇怪的是,当我注释掉textBoxUser.Enabled = false时,错误消失。思考?

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

    await Populate(); 

    textBoxUser.Enabled = true; //error here 
} 
+0

你正试图从不同的线程访问GUI元素。你需要一个调用。 – Trey

+0

'private async void buttonPopulate_Click'如果WinForms调用此事件处理程序,则应该在WinForms同步上下文中并继续在主线程上。你是自己调用这个方法还是从一个定时器调用这个方法,或者实际调用'await Populate()。ConfigureAwait(false);'? –

+0

@MongZhu稍微不同的问题和最新的答案已过时 – MickyD

回答

3

您的问题可能是由于VSTO未正确提供SynchronizationContext;这是Office插件系统长期存在的问题。您可以通过在事件处理程序的开始处检查SynchronizationContext.Current的值来验证此情况;如果是null,那么问题归因于VSTO。

为了解决这个问题,你可以在任何async void事件处理程序的开始这样做:

SynchronizationContext.SetSynchronizationContext(new WindowsFormsSynchronizationContext()); 
+1

确认这工作。谢谢 – dahel