What's wrong with my cross-thread call in Windows Forms?

Arseni Mourzenko picture Arseni Mourzenko · Jun 15, 2010 · Viewed 8.1k times · Source

I encounter a problem with a Windows Forms application.

A form must be displayed from another thread. So in the form class, I have the following code:

private delegate void DisplayDialogCallback();

public void DisplayDialog()
{
    if (this.InvokeRequired)
    {
        this.Invoke(new DisplayDialogCallback(DisplayDialog));
    }
    else
    {
        this.ShowDialog();
    }
}

Now, every time I run this, an InvalidOperationException is thrown on the line this.ShowDialog();:

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

What's wrong with this piece of code? Isn't it a valid way to make cross-thread calls? Is there something special with ShowDialog()?

Answer

SLaks picture SLaks · Jun 15, 2010

You're probably executing this code before the form has been shown.
Therefore, InvokeRequired is returning false.