Mik*_*e . 2 c# multithreading asynchronous async-await
我需要将一些网格列附加到网格,该网格最初只包含几列.创建列是长期运行的,我正在尝试使用async/await,但我得到"调用线程无法访问此对象,因为不同的线程拥有它"异常,所以有人可以指导我正确的方法做这个.AddRange调用发生异常.提前致谢.
private async void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
List<GridViewColumn> cols = await NewGridColsAsync();
viewGridControl.Columns.AddRange(cols);
}
private async Task<List<GridViewColumn>> NewGridColsAsync()
{
List<GridViewColumn> cols = new List<GridViewColumn>();
await Task.Run(() =>
{
for (int i = 0; i < 100; i++)
{
cols.Add(new GridViewColumn());
}
});
return cols;
}
Run Code Online (Sandbox Code Playgroud)
您正在GridViewColumn一个线程(由其创建Task.Run)上创建控件实例,并尝试将它们添加到其他线程(UI线程)上.由于在不同线程上创建的对象会出现异常.
正确的实现应该类似于以下代码.请注意,控件(实例GridViewColumn)是使用此代码在UI线程上创建的,稍后可用于从主UI线程添加其他控件的子项:
private async Task<List<GridViewColumn>> NewGridColsAsync()
{
IEnumerable<DataForColumn> dataForColumns;
await Task.Run(() =>
{
// collect data for columns, runs on thread-pool (non-UI) thread
dataForColumns = ....
});
// runs on UI thread
return dataForColumns.Select(data => CreateGridViewColumn(data)).ToList();
}
Run Code Online (Sandbox Code Playgroud)