【发布时间】:2021-09-22 17:13:01
【问题描述】:
我使用带有动画 gif 的等待表单。 我发现用动画 gif“移动”显示此表单的唯一方法是:
frmWaiting.Show()
Await Task.Run(Sub() AnyKindOfActionInASub)
frmWaiting.Close()
它运行良好,但如果我需要调用返回对象而不是简单子对象的异步函数怎么办?如果我这样做:
Dim TwitterAccountToAdd As TwitterAccount
frmWaiting.Show()
TwitterAccountToAdd = Await nsTweetInvi.CallTwitterApi.GetApiTwitterDatasAccount(Me.txtTwitterId.Text)
frmWaiting.Close()
动画 gif 被替换为白色方块。
考虑到 GetApiTwitterDatasAccount 返回一个 Task(Of TwitterAccount),我该怎么做?
【问题讨论】:
-
个人没有做太多异步,所以只是评论,但我相信诀窍是你仍然需要将你的调用包装在一个任务中,然后仍然等待任务,最后检查
Task.Result查找函数调用的结果。 -
你需要看看
GetApiTwitterDatasAccount在做什么。从外观上看,这对Await来说是一件完美的事情,但如果它在等待远程主机的响应之外做任何实质性的事情,那么“任何事情”都会在 UI 线程上运行并阻止你的动画。 -
@JoelCoehoorn 您建议的顺序与此处实际执行的顺序没有任何不同。实际区别在于原始代码使用
Task.Run,它将调度到线程池线程上。Task.Run并不适合像第二个那样等待 I/O 或网络,但正如我所指出的,如果它在等待之外做任何有趣的事情,那么“任何有趣的事情”都会发生在 UI 线程上。 -
GetApiTwitterDatasAccount实际上是异步的吗?如果是,则等待它的效果与第一个 sn-p 中的代码相同。否则,您可以Task.Run()它并等待结果,就像在第一个 sn-p 中一样。在这种情况下,它将是,例如,dim theText = Me.txtTwitterId.Text dim TwitterAccountToAdd = await Task.Run(Function() nsTweetInvi.CallTwitterApi.GetApiTwitterDatasAccount(theText))
标签: vb.net asynchronous async-await