【问题标题】:ConfigureAwait(false) with UI controls?带有 UI 控件的 ConfigureAwait(false)?
【发布时间】:2019-03-02 13:08:41
【问题描述】:

下面两个代码sn-ps可以用.ConfigureAwait(false)吗?

案例 1

var ds = new BindingSource();
ds.DataSource = await CallAsync(); // .ConfigureAwait(false);
UIControl.DataSource = ds;

案例 2

UIControl.DataSource = new BindingSource
{
    DataSource = await CallAsync() // .ConfigureAwait(false)
};

第一个好像是后台线程设置UI控件的问题?第二个呢?

【问题讨论】:

  • 是的,两种情况都有问题。
  • 不清楚你为什么要在这个context中考虑ConfigureAwait(false)。是因为 CallAsync() 没有那么多 async 吗?您是否使用Task.Run() 来实现一个不太常见的async 方法?也许只是部分async

标签: c# .net multithreading winforms async-await


【解决方案1】:

对控件的所有访问都应在创建控件的同一线程中完成。

通过调用ConfigureAwait(false),您要求不要尝试将延续编组回捕获的原始上下文。这意味着代码在与无效操作的 UI 线程不同的上下文中继续执行。

所以,答案是肯定的,以上两种情况都有问题,会导致:

InvalidOperationException:跨线程操作无效:控件“控件名称”从创建它的线程以外的线程访问。

【讨论】:

  • 数据绑定不能产生那个异常,臭名昭著的问题。
  • @HansPassant 您是指问题中提到的案例还是一些不同的案例? (我已经测试过问题案例,它们会抛出异常。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-08
相关资源
最近更新 更多