Hello,
I have the following code in a class library. And I wait for a call back into my main application. I am making a DownloadStringAsync call so I have to wait a few seconds to get the callback after it has finished. I have a 3 of these calls to wait for (but for being simple just testing with one), so in my main application I am using ManualResetEvent to wait all of them to finish. So I will block until they have been set in the callback functions.
However, after testing the callback don't get called. I am thinking when the code gets blocked by the ManualResetEvent as its blocking the DownloadStringAsync. As when I comment out this code everything works fine.
So I think as soon as I make a call to: objNoGateway.NoGatewayStatus(sipUsername, statusDisplay1.PhoneNumber); And when the code reaches here: handle.WaitOne(); It will block the code in the class library.
I think the main UI thread is being blocked, so cannot receive any messages.
Many thanks for any suggestions,
My class library:
Code:' Event handler that makes a call back in my main application ' Event handler and method that handles the event Public NoGatewayCompletedEvent As EventHandler(Of NoGatewayEventArgs) ' The method that raises the event. Private Sub OnNoGatewayCompleted(ByVal sender As Object, ByVal e As NoGatewayEventArgs) If NoGatewayCompletedEvent IsNot Nothing Then NoGatewayCompletedEvent(Me, e) End If End Sub ' Start the Async call to find if NoGateway is true or false Public Sub NoGatewayStatus(ByVal sipUsername As String, ByVal phoneNumber As String) Dim strURL As String = String.Format("http://xxxxxxxxxxxxxxx={0}&CalledNumber={1}", sipUsername, phoneNumber) If (Not wc.IsBusy) Then Try Dim errorMsg As String = String.Empty wc.DownloadStringAsync(New Uri(strURL)) Catch ex As WebException Console.WriteLine("IsNoGateway: " & ex.Message) Catch ex As Exception Console.WriteLine("IsNoGateway: " & ex.Message) End Try Else Console.WriteLine("WebClient: IsNoGateWay(): Busy please try again") End If End Sub Private Sub wc_DownloadStringCompleted(ByVal sender As Object, ByVal e As DownloadStringCompletedEventArgs) If e.Error Is Nothing Then If e.Result = "No gateway" Then OnNoGatewayCompleted(Me, New NoGatewayEventArgs(validateResponse_e.VALIDATION_FAILED)) Console.WriteLine("NoGatway() DownloadedCompleted: " & e.Result) Else OnNoGatewayCompleted(Me, New NoGatewayEventArgs(validateResponse_e.OK)) Console.WriteLine("NoGateway() DownloadCompleted: " & e.Result) End If Else Me.OnNoGatewayCompleted(Me, New NoGatewayEventArgs(validateResponse_e.SERVER_FAILED)) Console.WriteLine("No Gateway: DownloadCompleted() Error: " & e.Error.Message) End If End Sub
In my main application I register this callback. And wait for the for the result. Then set the ManualResetEvent.
Where I am start and then wait for the thread to finishCode:Private waitValidateCallResponse() As ManualResetEvent = { New ManualResetEvent(False), New ManualResetEvent(False), New ManualResetEvent(False) } ' Event handler for NoGateway event Private Sub OnNoGatewayCompleted(ByVal sender As Object, ByVal e As NoGatewayEventArgs) Console.WriteLine("OnNoGatewayComleted: " & e.noGateway) waitValidateCallResponse(0).Set() End Sub
Code:Private Sub ValidateDialedNumber() 'Incorrect country code has been entered. Using objNoGateway As New NoGateway() AddHandler objNoGateway.NoGatewayCompletedEvent, AddressOf OnNoGatewayCompleted objNoGateway.NoGatewayStatus(sipUsername, statusDisplay1.PhoneNumber) End Using ' Block here - Wait for all reponses to finish before moving on 'WaitHandle.WaitAll(waitValidateCallResponse); waitEvent.WaitOne(5000, True) Console.WriteLine("All thread finished") End Sub




Reply With Quote