The structure may be a little difficult to understand, but I will let you know the current situation.
STEP1: Call Form 1 from Class 1 (The Form 1 argument is defined on the interface and passes the class1 instance)
STEP 2: Create a new thread and start the method for the interface received with the argument from the Form 1 Down event.
STEP 3: I want to pick up an error in the thread that I started, but it's caught inside the method I ran, but I can't catch it even if I write a try at the top.
Class 1
dim f1 as new form 1(me)
f1.showdialog()
Form1
dim IF as Interface
sub new (byval IF as Interface)
me.InterFace=IF
end sub
' FormShown event
Dim Thread 1 As New System.Threading.Thread (New System.Threading.ThreadStart (AddressOfthreadA))
traffic1.isBackGround=true
traffic1.start()
private subthreadA
me.IF.method
end sub
The best timing to catch an error is class1, which calls Form1, but I can't catch an error in the first place.
Does anyone know?
The best timing to catch errors is class1, which calls Form1, but I can't catch them in the first place.
"It says ""Catch Error"", but as long as the expression ""catch"" is used, it is considered to be intended to catch an exception."
Exceptions are thrown at the caller.However, the thread is not in the calling relationship.In fact, running tread1.start()
moves the caller to the next line.Therefore, we cannot catch any exceptions that occurred on another thread.
However, Async introduced from Visual Studio 2012 transfers any exceptions that have been run on a separate thread to the caller.
As the question does not mention the version of Visual Studio and what you would like to do with a different thread, we cannot determine if this Async feature is available, so we will only introduce it.
Note: Asynchronous programming using Async and Await
As Sayuri wrote, the exception cannot be caught in Class 1 because the execution thread is different.In such a case, the Control.BeginInvoke
method can start processing on the UI thread, so if you re-throw the exception, it will be the desired behavior.
Private SubthreadA()
Try
me.IF.method
Add Catch ex As Exception 'Catch
ThrowException(ex)
End Try
End Sub
' Method for Throwing Exceptions on UI Threads
Private Sub ThrowException (ex As Exception)
Lock for SyncLock Me' flag
' It is possible that the form is already closed when an exception occurs, so it is determined.
If_closed Then
Return
End If
' If InvokeRequired is True, BeginInvoke as the threads are different
If Me. InvokeRequired Then
Me. BeginInvoke (New Action (Of Exception) (AddressOfThrowException), ex)
Return
End If
' Reslow exception on main thread
Throw New Exception ("threadA encountered an exception", ex)
End SyncLock
End Sub
' Form Closed Flag
Private_closed As Boolean
' Flag when the form is closed
Private SubForm1_FormClosed(sender As Object, eAsFormClosedEventArgs)Handles Me.FormClosed
SyncLock Me
_closed=True
End SyncLock
End Sub
© 2024 OneMinuteCode. All rights reserved.