Async / Await新手,这是否运行异步?

时间:2016-10-13 13:43:47

标签: vb.net multithreading asynchronous

我通常使用旧方法(线程,调用等)进行多线程处理。我查看了大量文档,并提出了以下内容。

这篇文章的原因是我在这里看到了数以百计的线程,人们会说,"你为什么这样做?它无论如何都是同步运行的。"基于我之前的阅读,我没有信心,认为这是正确的,并且是异步运行的。代码并不困难,它看起来对我来说 - 只需要一个' yes'或者没有'如果'不,'解释会很棒。提前谢谢。

程序循环发送合同。如果pdfs转到传真线,我们需要在发送到相同号码之间等待15秒。定时器/类逻辑有点复杂,但为此目的,只知道我有一个List(of Class),一旦完成就会自行清理。一旦列表为空,我就会触发一个事件来更新GUI。

GUI线程 - 调用

Private Async Sub ProcessIt(ByVal oList As List(Of String))
    'Code that sends emails, or creates the queue class and adds it to queue.
    Dim bWait As Boolean = Await WaitOnQueue()
    RaiseEvent ProcessComplete(ErrorList, Nothing)
End Sub

" Awaitable"功能(我认为)

Private Async Function WaitOnQueue() As Task(Of Boolean)
    While oQueue.Count > 0
        Await Task.Delay(500)
    End While
    Return True
End Function

我已经删除了不必使代码尽可能简单地进行评估的代码。这是运行异步还是在GUI线程上?再次感谢。

1 个答案:

答案 0 :(得分:1)

要明确的是,将async关键字添加到方法不会使方法异步(因为您似乎已假设)。这意味着您可以在方法中使用await关键字。

关于Task.Delay - 它旨在运行异步。 Task.Delay在不阻塞当前线程的情况下为您提供逻辑延迟。

但是在您的示例中,Task.Delay使您的方法仍然在UI线程中执行其CPU绑定工作。如果你的目标是在UI线程上做一些工作,那么你可以使用await Task.Run在线程池线程上运行它,并(异步地)获取方法的结果。