The InvokeRequired check and it's handling is there to make sure the UI controls are updated on the UI thread and not from your own thread. Your code seens to have all the bits but your code is in the wrong order. I take one example:
// this is called from any thread
public void videoImage(Image image)
{
// are we called from the UI thread?
if (this.InvokeRequired)
{
// no, so call this method again but this
// time use the UI thread!
// the heavy-lifting for switching to the ui-thread
// is done for you
this.Invoke(new MethodInvoker(delegate { videoImage(image); }));
}
else
{
// we are now for sure on the UI thread
// so update the image
this.VideoViewer.Image = image;
}
}