在 VB.NET 中将带有事件的异步调用转换为同步
Convert asynchronous call with events to synchronous in VB.NET
我有一个组件被分配了一个异步执行的任务。完成后,它将触发两个事件之一以表示成功或失败。我需要将所有这些转换为同步调用:
Public Function AssignTask(o As Object) as Boolean
Dim component As New X.Y.Z.Component()
component.DoSomethingWith(o)
AddHandler component.OnSuccess, AddressOf OnSuccess
AddHandler component.OnError, AddressOf OnError
Return True 'Need to return success or not.
End Sub
Private Sub OnSuccess(sender As Object, e As System.EventArgs)
'Success! :)
End Sub
Private Sub OnError(sender As Object, e As System.EventArgs)
'Error! :(
End Sub
我很困惑,关于如何让事件触发主方法成功或失败。
谢谢!
你可以这样做(这不是线程安全的,所以如果你为不同的线程调用它就不会很好地发挥作用)
Private _completedFlag As Boolean
Private _completionResult As Boolean
Public Function AssignTask(o As Object) as Boolean
Dim component As New X.Y.Z.Component()
_completedFlag = False
AddHandler component.OnSuccess, AddressOf OnSuccess
AddHandler component.OnError, AddressOf OnError
component.DoSomethingWith(o)
Do Until _completedFlag
'wait
Loop
Return _completionResult
End Sub
Private Sub OnSuccess(sender As Object, e As System.EventArgs)
_completionResult = True
_completedFlag = True
End Sub
Private Sub OnError(sender As Object, e As System.EventArgs)
_completionResult = False
_completedFlag = True
End Sub
我已将 AddHandler 移动到您实际调用该方法之前,因为它有可能在附加处理程序之前完成
我有一个组件被分配了一个异步执行的任务。完成后,它将触发两个事件之一以表示成功或失败。我需要将所有这些转换为同步调用:
Public Function AssignTask(o As Object) as Boolean
Dim component As New X.Y.Z.Component()
component.DoSomethingWith(o)
AddHandler component.OnSuccess, AddressOf OnSuccess
AddHandler component.OnError, AddressOf OnError
Return True 'Need to return success or not.
End Sub
Private Sub OnSuccess(sender As Object, e As System.EventArgs)
'Success! :)
End Sub
Private Sub OnError(sender As Object, e As System.EventArgs)
'Error! :(
End Sub
我很困惑,关于如何让事件触发主方法成功或失败。
谢谢!
你可以这样做(这不是线程安全的,所以如果你为不同的线程调用它就不会很好地发挥作用)
Private _completedFlag As Boolean
Private _completionResult As Boolean
Public Function AssignTask(o As Object) as Boolean
Dim component As New X.Y.Z.Component()
_completedFlag = False
AddHandler component.OnSuccess, AddressOf OnSuccess
AddHandler component.OnError, AddressOf OnError
component.DoSomethingWith(o)
Do Until _completedFlag
'wait
Loop
Return _completionResult
End Sub
Private Sub OnSuccess(sender As Object, e As System.EventArgs)
_completionResult = True
_completedFlag = True
End Sub
Private Sub OnError(sender As Object, e As System.EventArgs)
_completionResult = False
_completedFlag = True
End Sub
我已将 AddHandler 移动到您实际调用该方法之前,因为它有可能在附加处理程序之前完成