具有UI控件的ConfigureAwait(false)?

时间:2019-03-02 02:33:45

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

可以将.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控件的问题?第二个呢?

1 个答案:

答案 0 :(得分:1)

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

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

因此,答案是肯定的,以上两种情况都存在问题,并且会导致:

  

InvalidOperationException:跨线程操作无效:从创建该线程的线程之外的其他线程访问控件“控件名称”。