c# - 在 VSTO 中使用异步/等待跨线程操作无效

标签 c# multithreading asynchronous async-await 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());

关于c# - 在 VSTO 中使用异步/等待跨线程操作无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45590773/

相关文章:

c# - 调用异步 ActionResults 时,AllowVoidAsyncOperations 何时设置?

c# - 范围之间的随机 DateTime - 不统一输出

multithreading - 线程安全可以被忽略吗?

node.js - NodeJS,从async wait获取返回值

javascript - 循环 javascript 对象,同时在其中运行异步调用

asynchronous - 是否可以使用 CaSTLe.DynamicProxy 创建异步拦截器?

c# - 我可以设置 ReSharper 以将未导入的类用法重命名为它们的全名而不是导入它们的命名空间吗?

c# - 从 C# 中的谷歌搜索获取链接

c - 关于Getcontext函数的问题

c++ - 我是否需要保护对仅在同一线程中修改的变量的读取?