c# – Windows窗体中的跨线程调用有什么问题?

前端之家收集整理的这篇文章主要介绍了c# – Windows窗体中的跨线程调用有什么问题?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我遇到 Windows窗体应用程序的问题.

必须从另一个线程显示表单.所以在表单类中,我有以下代码

private delegate void DisplayDialogCallback();

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

现在,每次运行它,都会抛出一个InvalidOperationException行this.ShowDialog();:

“跨线程操作无效:控制’SampleForm’从一个线程访问,除了它创建的线程.

这段代码怎么了?是不是有效的方式进行跨线程通话? ShowDialog()有什么特别之处吗?

解决方法

尝试这个:
private delegate void DisplayDialogCallback();

public void DisplayDialog()
{
    if (this.Invokerequired)
    {
        this.Invoke(new DisplayDialogCallback(DisplayDialog));
    }
    else
    {
        if (this.Handle != (IntPtr)0) // you can also use: this.IsHandleCreated
        {
            this.ShowDialog();

            if (this.CanFocus)
            {
                this.Focus();
            }
        }
        else
        {
            // Handle the error
        }
    }
}

请注意Invokerequired返回

true if the control’s Handle was
created on a different thread than the
calling thread (indicating that you
must make calls to the control through
an invoke method); otherwise,false.

因此,如果控件尚未创建,返回值将为false!

猜你在找的C#相关文章