首页 > 编程语言 >c# async和await

c# async和await

时间:2023-04-06 16:34:16浏览次数:42  
标签:异步 c# await Print Debug async 执行

  一直以来对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我通过异步的效果来执行,这样就不用等待所有的操作执行完了再显示出页面。

 

标签:异步,c#,await,Print,Debug,async,执行
From: https://www.cnblogs.com/tpcwlilacfover/p/17293143.html

相关文章

  • 保证高效写入查询的情况下,如何实现 CPU 资源和磁盘 IO 的最低开销?
    从《写入性能:TDengine最高达到InfluxDB的10.3倍,TimeScaleDB的6.74倍》、《查询性能:TDengine最高达到了InfluxDB的37倍、TimescaleDB的28.6倍》两篇文章中,我们发现,TDengine不仅在写入和查询性能上超越了InfluxDB和TimescaleDB,在数据处理过程的资源消耗也比两......
  • Containerd接入Harbor仓库【3】
    1.说明在使用容器时,避免不了会使用到私有仓库,一般都是采用harbor作为私有仓库,docker对接harbor仓库非常简单,哪containerd如何对接harbor呢?在内网使用harbor根据个人习惯,一般都是非http并且是通过IP直接访问,如下:harbor仓库地址为:http://192.168.199.102:80,cont......
  • Unable to handle kernel NULL pointer dereference at virtual address 分析
    引用:https://blog.csdn.net/agave7/article/details/119875023虽然问题不一样,但是分析问题的方法是一致的。UnabletohandlekernelNULLpointerdereferenceatvirtualaddress分析现象[136.847780]br-lan:receivedpacketoneth0.1withownaddressassourceadd......
  • 建模copy时报错[lsFrozen Field is not found in the CDO xxxxChanges] 的解决方法
    报错如图  日志报错如下  根据日志内容查找问题原因:由于SetIsFrozen逻辑导致异常。解决办法:重写Maint的SaveAs方法,去掉SetIsFrozen逻辑。  ......
  • mysql 窗口函数(Window Functions)
    MySQL窗口函数(WindowFunctions)是一种高级的SQL查询技巧,它允许在结果集的一组相关行上执行计算。窗口函数可以用于处理分组、排序、累计等复杂的聚合任务,使得查询更加简洁和高效。在MySQL8.0及更高版本中,支持窗口函数。以下是一些常用的窗口函数:ROW_NUMBER():为结果集中的......
  • VSCode插件Project Manager的使用方法
    1.在VSCode扩展里下载插件ProjectManager   2.点击文件,打开文件夹  3.这是你当前在vscode中打开的项目,单机回车就可以保存到项目管理  3.如果同时保存了多个项目管理文件,还可以给他们进行分组。 单击图标后编辑tags内容  4.再点击如下图标即可看......
  • AI智能视频融合平台EasyCVR新增功能:支持普通用户收藏通道
    EasyCVR平台可在复杂的网络环境中,将分散的各类视频资源进行统一汇聚、整合、集中管理,实现视频资源的鉴权管理、按需调阅、全网分发、智能分析等。平台可支持多协议、多类型的设备接入,可覆盖市面上绝大多数的视频源设备,包括:IPC、NVR、视频编码器、移动执法仪、应急布控球、移动警用......
  • 通过 Homebrew 在 Mac OS X 上安装和配置 Redis
    通过使用Homebrew,可以大大降低在MacOSX上设置和配置开发环境的成本。让我们安装Redis。$brewinstallredis安装后,我们将看到一些有关配置注意事项的通知。离开它并继续关注本文中的一些任务。开机自启动Redis$ln-sfv/usr/local/Cellar/redis/7.0.10/*.plist......
  • 【技术教程】在EasyCVR平台中打开第三方桌面端应用的实现过程
    EasyCVR视频融合平台基于云边端协同架构,具有强大的数据接入、处理及分发能力,平台支持海量视频汇聚管理,可支持多协议接入,包括市场主流标准协议与厂家私有协议及SDK,如:国标GB28181、RTMP、RTSP/Onvif、海康Ehome、海康SDK、宇视SDK等(具体见下图)。平台能在复杂的网络环境中,将分散的各......
  • opencv-python 4.12. 模板匹配
    理论模板匹配是一种在较大图像中搜索和查找模板图像位置的方法。为此,OpenCV附带了一个函数cv.matchTemplate()。它只是在输入图像上滑动模板图像(如在2D卷积中),并比较模板图像下的输入图像的模板和补丁。在OpenCV中实现了几种比较方法。它返回一个灰度图像,其中每个像素表示该像素的......