我通常使用旧方法(线程,调用等)进行多线程处理。我查看了大量文档,并提出了以下内容。
这篇文章的原因是我在这里看到了数以百计的线程,人们会说,"你为什么这样做?它无论如何都是同步运行的。"基于我之前的阅读,我没有信心,认为这是正确的,并且是异步运行的。代码并不困难,它看起来对我来说 - 只需要一个' 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线程上?再次感谢。
答案 0 :(得分:1)
要明确的是,将async
关键字添加到方法不会使方法异步(因为您似乎已假设)。这意味着您可以在方法中使用await
关键字。
关于Task.Delay
- 它旨在运行异步。 Task.Delay
在不阻塞当前线程的情况下为您提供逻辑延迟。
但是在您的示例中,Task.Delay
使您的方法仍然在UI线程中执行其CPU绑定工作。如果你的目标是在UI线程上做一些工作,那么你可以使用await Task.Run
在线程池线程上运行它,并(异步地)获取方法的结果。