c# async和await

发布时间 2023-04-06 16:32:09作者: 向往蓝天的伟

  一直以来对async和await都有点迷糊,今天花时间在网上看了很多解释,现在把自己的理解整理下,如果有不对的地方希望大家指正。

  await这里有几点说明:

  1、只能在async修饰的函数中使用

  2、使用了await表明需要异步等待(就是将异步执行变为同步执行效果,与同步代码不同的是使用await执行的异步代码块不阻塞UI)

  注意:关于await执行的异步代码块不阻塞UI这块之前一直没有体会到,最后发现在async修饰的函数里面需要新建个线程执行这样才会有不阻塞UI的效果,不是加了async就会新产生一个线程来执行,需要手动的新建线程来执行耗时比较长的操作。

下面写一个小例子来说明这点:

public async Task<string> getBody()
{
return await Task.Run(() =>
{
Thread.Sleep(20000);
return "Body";
});
}
public async Task Paint()
{
Debug.Print("hearder");
Debug.Print(await getBody());
Debug.Print("Footer");
}

public async void test()
{
Debug.Print("start");
await Paint();
Debug.Print("end");

}

 

调用test方法执行结果

start

hearder

等待20s

Body

Footer

end

调用test不会阻塞UI

注意:如果getBody没有新建一个新的线程UI会阻塞。

 

总结:

  目前稍微体会到async和await作用,就是可以将异步的操作变为同步的效果。有写场景有三个操作需要按顺序执行,但是这三个操作又是异步的就可以使用await实现异步等待按照123顺序执行。

  比如上面的例子,我想获取一个页面,我可以先显示头部,耗时的body我通过异步的效果来执行,这样就不用等待所有的操作执行完了再显示出页面。