个人理解:
假设运算量很大的方法是complicated(),UI更新方法是ui();
1. complicated(); ui();
前者会阻塞主线程,导致页面卡死,等卡死完后再出现UI更新
2.Task.Run(()=>complicated()); ui();
开了一个线程运行前者,后者在线程没结束的时候已经出现,没有意义
3.await Task.Run(()=>complicated()); ui();
等待前者异步完成后,再更新UI,此时页面也不会卡死
------------------------------------------------------------------------------------------------------
如果需要在运行前者的时候根据运行情况动态更新ui,可在complicated方法中加入更新页面ui的委托(使用以上第三种),然后在需要更新的地方使用this.BeginInvoker()方法,该方法只能在新建的线程里运行才有效果,官方解释为:在创建控件基础句柄的线程上异步执行指定的委托。
总的来说,大概代码就是
void complicated(){
for(int i = 1;i<=99999999;i++){
//逻辑代码
Action a = new Action(()=>{ //ui更新 });
this.BeginInvoker(a);
}
}
async method(){
await Task.Run(()=>complicated());
Console.write("end");
}