Task.Run调用带返回值异步函数时等待窗体GIF动图冻结如何解决
问题原因
- 你之前无返回值的方案可以正常运行,核心是把业务逻辑通过
Task.Run放到线程池线程执行,UI线程全程空闲可正常渲染GIF动画 - 后续带返回值的写法直接在UI线程
AwaitGetApiTwitterDatasAccount,如果该异步方法内部存在同步阻塞逻辑(比如请求参数构造、同步IO操作等),会直接占用UI线程,导致窗体无法刷新,GIF就会变成白色方块
解决方案
把带返回值的异步调用也包裹进Task.Run中即可,同时注意提前读取UI控件属性避免跨线程访问报错,修改后代码如下:
' 提前在UI线程读取控件属性,避免跨线程访问异常 Dim twitterId As String = Me.txtTwitterId.Text Dim TwitterAccountToAdd As TwitterAccount frmWaiting.Show() TwitterAccountToAdd = Await Task.Run(Async Function() Return Await nsTweetInvi.CallTwitterApi.GetApiTwitterDatasAccount(twitterId) End Function) frmWaiting.Close()
补充说明
- 该写法和你之前无返回值的实现逻辑完全一致,
Task.Run会把整个异步逻辑调度到线程池执行,UI线程仅负责等待和刷新窗体,不会被阻塞 - 如果后续遇到其他类似的异步调用导致UI卡顿的场景,都可以用相同的方式包裹处理
内容的提问来源于stack exchange,提问作者8oris
相关产品推荐
相关产品推荐

