【问题标题】:Calling an async function in Task.Run在 Task.Run 中调用异步函数
【发布时间】: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


【解决方案1】:

按照 Jimi 的建议,我找到了一个完美的解决方案。

Private TwitterAccountToAdd As New TwitterAccount
Dim strTwitterId As String = Me.txtTwitterId.Text
Dim frmWaitingTwitter As New frmWaiting
Me.TopMost = False
With frmWaitingTwitter
     .TopMost = True
     .Show()
     .StartPosition = FormStartPosition.CenterScreen
End With
TwitterAccountToAdd = Await Task.Run(Function() CheckAndGetTwitterAccount(strTwitterId))
frmWaitingTwitter.Close()
Me.TopMost = True

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-20
    • 2016-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-09
    • 2021-12-25
    相关资源
    最近更新 更多