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

c# – 从另一个线程调用show后挂起的Windows窗体

发布时间:2020-12-16 01:48:05 所属栏目:百科 来源:网络整理
导读:我有一些应用程序,它有一些异步运行的网络代码.当没有连接到服务器时,我附加了一些要抛出的事件,当发生这种情况时,我正在创建一些“操作失败”的表单.问题是我的表单在创建后挂起.我读到了这一点,我尝试用: public void ShowView(){ if (this.InvokeRequire
我有一些应用程序,它有一些异步运行的网络代码.当没有连接到服务器时,我附加了一些要抛出的事件,当发生这种情况时,我正在创建一些“操作失败”的表单.问题是我的表单在创建后挂起.我读到了这一点,我尝试用:

public void ShowView()
{
    if (this.InvokeRequired)
    {
        Action a = new Action(ShowView);
        this.Invoke(a);
    }
    else this.Show();
}

问题仍然存在.比我发现如果没有创建控件,InvokeRequired返回false.
所以我在初始化代码中添加了:

this.show();
this.hide();

这种方式似乎有效.但它非常难看,当我的应用程序启动时,我可以看到我的表单被显示而不是消失.
我应该如何让我的表单创建所有控件而不显示它,或者是否有更好的解决方案来解决这个问题?

编辑:更多信息.我正在使用MVP设计模式.我有Presenter,它依赖于IView.我的表单实现了IView. IView有我从我的演示者调用的ShowView()和HideVIew()方法.我的演示者从另一个线程接收事件.那么我应该在哪里进行这种线程跳转或者我应该如何解决这个问题?

EDIT2:这里示例应用程序说明问题:

public partial class Form1 : Form
    {
        Form2 form;

        public Form1()
        {
            InitializeComponent();
            form = new Form2();
        }

        private void button1_Click(object sender,EventArgs e)
        {
            //form.Show();
            //form.Hide();
            Thread t = new Thread(new ThreadStart(ShowForm2));
            t.Start();
        }

        private void ShowForm2()
        {
            if (form.InvokeRequired)
            {
                Action a = new Action(ShowForm2);
                form.Invoke(a);
            }
            else
            {
                form.Show();
                Thread.Sleep(5000);
            }
        }
    }

你能告诉我这个具体问题要改变什么吗?

解决方法

您对Invoke和InvokeRequired的理解有点偏差;只要从创建它的线程以外的线程(通常称为“UI线程”)访问控件,InvokeRequired将返回true.

因此,如果您尝试从另一个线程调用Show()或Hide(),则确实需要调用它.

除了简短的解释,您还没有提供足够的信息来真正提供任何其他想法.也许你可以发布一些相关的代码,比如在加载或激活表单时执行的任何代码.

编辑

在创建和显示新表单之前,您需要返回UI线程.正如在评论中指出的那样,将它显示为您的应用程序启动然后隐藏它的工作原理,因为这一切都发生在UI线程上.

一种方法是,如果你有一个始终可见的“MainForm”,你可以将ShowView方法移动到那个表单,并使用InvokeRequired`Invoke`模式来保持UI线程的工作.

另一个选项是默认情况下将WindowState设置为Minimized,这样当它最初显示时(在应用程序启动时)它在屏幕上不可见(您也可以将ShowInTaskbar设置为false).然后您的ShowView方法也可以更改WindowState.

(编辑:李大同)

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

    推荐文章
      热点阅读