Me.Invoke - Incorrect behavior

  • Thread starter Thread starter Guest
  • Start date Start date
G

Guest

I have encountered an odd behavior when using Me.Invoke and any help would
be great. I am using a standard Me.InvokeRequired followed be a Me.Invoke to
make sure a method runs on the UI thread. This logic has worked for me
countless times but for some reason I have a problem with it in one
circumstance. The Me.Invoke is called but it does not create the delegate on
the UI thread. Instead it creates the delegate on the same thread which then
gets caught by the Me.InvokeRequired which call Me.Invoke and this continues
until I get a stack overflow. So my question is what would cause Me.Invoke to
not use the UI thread but instead the thread that it is currently on? Below
is a code snippet....

Private Delegate Sub SetButtonDelegate(ByVal Value As Boolean)
Private Sub SetButton(ByVal Value As Boolean)
If Me.InvokeRequired Then
Dim newDelegate As New SetButtonDelegate(AddressOf SetButton)
Me.Invoke(newDelegate, New Object() {Value})
Else
Mylabel.Enabled = Value
Mybutton.Enabled = Value
End If

End Sub

Thanks
Madison
 
Madison,

It doesn't matter where you create the delegate. Only the reference to the
control, on which the Invoke is called matters.

Looking in the posted code I don't see any reason why you get this
recursion.

My best guess is that the recursion happens from the code in the *Else*
clause of the IF statement. For example setting the
Mybutton.Enabled to Value may cause SetButton method to be called again
which will go in the Elese and execute Mybutton.Enabled = Value again that
will call SetButton and so on and so forth....

Try to set break points in both branches of the IF statement. See how the
execution of the code goes. Inspect the calling thread when the break point
is hit.

IMHO the problem is not in the Invoke.
 
Thanks for the response....
I have placed logging in the code that logs the Thread ID. Each time the
thread ID is the same and it is not the UI thread. It never gets to the
"Else" portion of the code like it should because Me.InvokeRequired is always
returning "true". The code works fine except when we do one particular
function first. It appears that this prior function is causing a threading
issue but I don't know what it is. I am hoping that someone has encountered
this before or knows why the Me.Invoke isn't creating the delegate on the UI
thread. It is almost as if the Me.Invoke is being forced to use the same
thread because the UI thread is busy or in an error state.
 
Hi,

I apparently haven't seen this problem and sounds very strange giving the
fact how Control.Invoke works. Is it possible that you have post the code
for this methods that mess up with Control.Invoke or if you have isolated
the portion of the code that most likely causes the problem just this code
snippet?
 
Back
Top