加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 07:49:01 所属栏目:百科 来源:网络整理
导读:我遇到 Windows窗体应用程序的问题. 必须从另一个线程显示表单.所以在表单类中,我有以下代码: private delegate void DisplayDialogCallback();public void DisplayDialog(){ if (this.InvokeRequired) { this.Invoke(new DisplayDialogCallback(DisplayDia
我遇到 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!

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读