Excel VBA - лучший способ приостановить выполнение процедурного кода во время ожидания асинхронной операции - PullRequest
0 голосов
/ 14 июля 2020
• 1000 я сейчас делаю)

Допустим, у вас есть два модуля класса, AsyncClassModule

Public Event ExampleEvent()

Public Sub DoSomethingAsynchronous()
    'Some operation would run here, then fire the event when complete
    'In the real case I'm working with, this is an external library I can't control
    RaiseEvent ExampleEvent
End Sub

и CallerClassModule

Private WithEvents x As AsyncClassModule

Private Sub Class_Initialize()
    Set x = New AsyncClassModule
    
    x.DoSomethingAsynchronous
    
    'This is the issue; need to somehow wait for asynchronous operation to complete before proceeding
    
    MsgBox "All done!"
End Sub

Что бы я хотел нужно сделать, после вызова DoSomethingAsynchronous приостановить выполнение кода до тех пор, пока ExampleEvent не сработает. В настоящее время я просто занят и жду, например:

Private WithEvents x As AsyncClassModule
Private asyncOperationComplete As Boolean

Private Sub Class_Initialize()
    Set x = New AsyncClassModule
    
    asyncOperationComplete = False
    x.DoSomethingAsynchronous
    
    While Not asyncOperationComplete
        DoEvents
        Sleep 1000
    Wend
    
    MsgBox "All done!"
End Sub

Private Sub x_ExampleEvent()
    asyncOperationComplete = True
End Sub

Есть ли в этой ситуации альтернативы циклу, которые не будут занимать процессорное время во время ожидания? В псевдокоде в идеале я бы хотел что-то вроде этого:

x.DoSomethingAsynchronous
Pause until x.ExampleEvent fires
MsgBox "All done!"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...