通过 Task.Run 离开 UI 线程
只要我一路await下去,就不会阻塞 UI 线程,曾经我是这么认为的,直到我用MySql官方驱动连接数据库。
事情是很简单的,我一直觉得我的自用工具箱动画好像有点掉帧,不严重,大概也就几帧的样子,但我检查了ViewModel确定正确使用了异步命令,按理说是不该有这个卡顿的。排查一圈也没啥头绪,只好试探性的加了一个 Task.Run,结果那是一个流畅。
我的代码是没问题,问题肯定是MySql驱动上了,毕竟之前我也发现,这个驱动异步连接好像是错的,如果连接不上根本捕获不到异常,写的时候没太在意,异步不行就Task.Run包一下同步方法呗,问题不大,但现在看来,好像所有的异步操作都是假的。后面我查了一下,好家伙,MySql 官方驱动bug一堆,第三方的MySqlConnector稳定好用功能多 ╮(╯▽╰)╭。
虽然这个问题可以通过更换驱动来解决,但是这个事情吧,他就很有意思:如果你调用的异步方法,他他是个假异步,应该怎么办?毕竟队友不一定总是靠谱,依赖的库也不一定是靠谱的。
思来想去,还是决定使用 Task.Run 把这些不属于 UI 线程的操作包起来,这样有两个好处:
- 保证不会阻塞 UI 线程,一行多余的代码都不会在 UI 线程执行。
Task.Run本身是一个很明确的分界,排查线程问题时更加容易。
当然,万事万物都有缺点,这么搞基本就是自动挡变半自动,利弊参半吧。我个人觉得,拿不准的地方加一下Task.Run准没错,可以作为一个推荐规范使用。
这个应该也算是防御性编程了吧
本文由作者按照 CC BY 4.0 进行授权