Нельзя изменить пользовательский интерфейс из другого потока в любой операционной системе.Этот код можно значительно упростить, если используется async/await
и Task.Run
перемещает внутри функций, например:
async Task functionA(){
var results= await Task.Run(()=>Getlist1();
control1.DataSource =results ;
control1.Databind();
}
async Task functionB(){
var results= await Task.Run(()=>Getlist2();
control2.DataSource =results ;
control2.Databind();
}
async Task functionC(){
var results= await Task.Run(()=>Getlist3();
control3.DataSource =results ;
control3.Databind();
}
var tasks = await Task.WhenAll( functionA(),
functionB(),
functionC());
await
ожидает завершения уже асинхронной операциибез блокировки.Когда эта операция завершается, она возвращает выполнение исходному потоку, в этом случае поток пользовательского интерфейса