alex
alex

Reputation: 1711

VB.NET Cross-thread operation not valid

I have a loop (BackgroundWorker) that is changing a PictureBox's Location very frequently, but I'm getting an error -

Cross-thread operation not valid: Control 'box1' accessed from a thread other than the
  thread it was created on.

I don't understand it at all, so I am hoping someone can help me with this situation.

Code:

  box1.Location = New Point(posx, posy)

Upvotes: 1

Views: 3671

Answers (2)

ZerOne
ZerOne

Reputation: 1326

For other people which coming across this error:

Try the dispatcher object: MSDN

My code:

Private _dispatcher As Dispatcher

Private Sub ThisAddIn_Startup(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Startup
    _dispatcher = Dispatcher.CurrentDispatcher
End Sub

Private Sub otherFunction()
    ' Place where you want to make the cross thread call
   _dispatcher.BeginInvoke(Sub() ThreadSafe())
End Sub

Private Sub ThreadSafe()
    ' here you can make the required calls
End Sub

Upvotes: 1

NoviceProgrammer
NoviceProgrammer

Reputation: 3365

This exception is thrown when you try to access control from thread other than the thread it was created on.

To get past this, you need to use the InvokeRequired property for the control to see if it needs to be updated and to update the control you will need to use a delegate. i think you will need to do this in your backgroundWorker_DoWork method

Private Delegate Sub UpdatePictureBoxDelegate(Point p)

Dim del As New UpdatePictureBoxDelegate(AddressOf UpdatePictureBox)

Private Sub UpdatePictureBox(Point p)
    If pictureBoxVariable.InvokeRequired Then

        Dim del As New UpdatePictureBoxDelegate(AddressOf UpdatePictureBox)
        pictureBoxVariable.Invoke(del, New Object() {p})
    Else
        ' this is UI thread     
    End If
End Sub

Upvotes: 3

Related Questions