Visual Studio启动项目表单问题

时间:2015-01-31 04:34:13

标签: c# multithreading winforms visual-studio-2012

这是我第一次遇到这种问题,而且我不确定我应该把这个问题作为这个帖子的标题,因为我知道问题是什么(我认为)但是我不知道#39;知道解决方法。

在我的项目中,当它运行时,我会显示一个加载资源的启动画面,然后它会转移到主编辑器,主编辑器在新的线程中启动和启动;这是代码:

void EngineLoader_RunWorkerCompleted( object sender , RunWorkerCompletedEventArgs e )
        {
            new Thread( new ThreadStart( delegate
            {
                using( _editorInstance )
                {
                    Application.Run( _editorInstance );
                }
            } ) ).Start();
            this.Dispose();
        }

在上面的代码中,我创建了新的主线程实例,启动它,然后处理了曾经有第一个应用程序线程实例的splashscreen。它工作,除了我的主编辑器始终启动BEHIND当前的Visual Studio窗口,即使我将窗体窗口状态设置为最大化或尝试强制关注它。因此,我必须始终将鼠标移动到任务栏并单击应用程序图标以强制编辑器显示在Visual Studio窗口上方。我确信这种情况正在发生,因为我正在一个新的线程中创建并启动新表单,并且不知何故它没有获得某种类型的当前窗口看着我" ...的事情。这是另一张图片,展示了在闪屏消失后我看到的内容:

enter image description here

更新

我刚刚注意到,如果我不处理启动画面,新窗口就会在当前视觉工作室窗口的前方/上方弹出。所以这段代码修复了它:

void EngineLoader_RunWorkerCompleted( object sender , RunWorkerCompletedEventArgs e )
        {
            new Thread( new ThreadStart( delegate
            {
                using( _editorInstance )
                {
                    Application.Run( _editorInstance );
                }
            } ) ).Start();
            //this.Dispose(); // Comment it out, so that the thread is not killed.
        }

但问题是,我想要杀死第一个线程,以及启动屏幕。似乎新的主要应用程序线程没有获得那种"焦点"它应该是。

1 个答案:

答案 0 :(得分:0)

发布这个因为我确实找到了解决方案,尽管我觉得它更像是一个丑陋的黑客而不是解决方案。我们显式地终止了线程,而不是处理splashscreen形式(它杀死了关联的线程而只留下了新的一个)。这显然是有效的,因为新形式(它是引擎的大部分)弹出当前的可视工作室窗口,当它关闭时,线程终止并且完整运行的项目关闭(这意味着我没有任何挥之不去的线程运行)。

以下是目前的解决方案:

void EngineLoader_RunWorkerCompleted( object sender , RunWorkerCompletedEventArgs e )
        {
            new Thread( new ThreadStart( delegate
            {
                using( _editorInstance )
                {
                    Application.Run( _editorInstance );
                }
            } ) ).Start();
            Application.Exit();// Take the thread out back behind the shed and shoot it in the head.
        }

谁能告诉我" this.Dispose()"之间的区别是什么?和" Application.Exit()"在交换线程方面?