繁体   English   中英

如何在第一个表单的相同线程上打开第二个表单?

[英]How to open a second form on the same thread of the first form?

我有2种形式的WinForms客户端。 第一种形式调用一个单独的类,该类使用'SignalR'来接收来自WebApi的通知。 该类中特定消息的中心代理的设置为:

onResult = myProxy.On<int>("Result", (id) =>
{
    Result?.Invoke(this, new ResultEventArgs(id));
});

在第一种形式中,我订阅Result事件,然后得到:

private void OnResult(object sender, ResultEventArgs e)
{
   using (var form = new SecondForm(e))
   {
       var dialogResult = form.ShowDialog(this);
       if (dialogResult == DialogResult.Cancel)
           return;
   }
}

我在var dialogResult = form.ShowDialog(this);上得到了CrossThreadException 第一个表单( this )在UI线程上打开。 第二种形式是在与SignalR类使用的相同线程中打开的。

我确实需要使用ShowDialog(this)打开第二个表单,因为我需要它成为应用程序中最顶层的表单。

有解决此问题的方法吗? 是否可以在UI线程中打开第二个表单?

更新:

一种可行的解决方法:

form.TopMost = true;                   
form.StartPosition = FormStartPosition.CenterScreen;

唯一的缺点是该表单是桌面上最顶层的表单,而不仅仅是应用程序内部。

您不能在单个UI线程以外的任何线程上创建,更改或访问任何UI控件。 您必须在现有控件上调用.Invoke(...) ,以将来自另一个线程的调用编组回UI。

尝试这个:

private void OnResult(object sender, ResultEventArgs e)
{
    Action x = () =>
    {
        using (var form = new SecondForm(e))
        {
            var dialogResult = form.ShowDialog(this);
            if (dialogResult == DialogResult.Cancel)
                return;
        }
    };

    this.Invoke(x);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM