Visual Studio 启动项目表单问题
Visual Studio Start Project Form Issue
这是我第一次遇到这种问题,我不太确定我应该把这个帖子的标题写成什么,因为我知道问题是什么(我想)但是我不知道 work-around.
在我的项目中,当它是 运行 时,我会显示一个加载资源的启动画面,然后它会跳转到主编辑器,它在一个新线程中启动并启动;这是代码:
void EngineLoader_RunWorkerCompleted( object sender , RunWorkerCompletedEventArgs e )
{
new Thread( new ThreadStart( delegate
{
using( _editorInstance )
{
Application.Run( _editorInstance );
}
} ) ).Start();
this.Dispose();
}
在上面的代码中,我创建了新的主线程实例,启动它,然后处理启动画面,它曾经有第一个应用程序线程实例。它有效,除了我的主编辑器总是在当前 Visual Studio window 后面启动,即使我将表单 window 状态设置为最大化或试图强制关注它。因此,我必须始终将鼠标向下移动到任务栏并单击应用程序图标以强制编辑器出现在 Visual Studio window 上方。我确信这正在发生,因为我正在新线程中创建和启动新表单,但不知何故它没有获得某种 "Current Window look at me"... 东西。这是另一张图片,显示了启动画面消失后我看到的内容:
更新:
我刚刚注意到,如果我不处理初始屏幕,新的 window 会正常弹出 - 在 front/above 当前 visual studio window.所以这段代码修复了它:
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.
}
但问题是,我想要终止第一个线程,以及启动画面。似乎新的主应用程序线程没有获得应有的那种 "focus"。
发布这个是因为我确实找到了解决方案,尽管我觉得它更像是一个丑陋的 hack 而不是解决方案。我们没有处理闪屏表单(它会杀死关联的线程,只留下新线程 运行),而是显式终止线程;这显然有效,因为新表单(这是引擎的主体)会在当前 visual studio window 上方弹出,当它关闭时,线程终止,完整的 运行 项目关闭(这意味着我没有任何挥之不去的线程 运行)。
这是当前的解决方案:
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()" 在交换线程方面有什么区别?
这是我第一次遇到这种问题,我不太确定我应该把这个帖子的标题写成什么,因为我知道问题是什么(我想)但是我不知道 work-around.
在我的项目中,当它是 运行 时,我会显示一个加载资源的启动画面,然后它会跳转到主编辑器,它在一个新线程中启动并启动;这是代码:
void EngineLoader_RunWorkerCompleted( object sender , RunWorkerCompletedEventArgs e )
{
new Thread( new ThreadStart( delegate
{
using( _editorInstance )
{
Application.Run( _editorInstance );
}
} ) ).Start();
this.Dispose();
}
在上面的代码中,我创建了新的主线程实例,启动它,然后处理启动画面,它曾经有第一个应用程序线程实例。它有效,除了我的主编辑器总是在当前 Visual Studio window 后面启动,即使我将表单 window 状态设置为最大化或试图强制关注它。因此,我必须始终将鼠标向下移动到任务栏并单击应用程序图标以强制编辑器出现在 Visual Studio window 上方。我确信这正在发生,因为我正在新线程中创建和启动新表单,但不知何故它没有获得某种 "Current Window look at me"... 东西。这是另一张图片,显示了启动画面消失后我看到的内容:
更新:
我刚刚注意到,如果我不处理初始屏幕,新的 window 会正常弹出 - 在 front/above 当前 visual studio window.所以这段代码修复了它:
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.
}
但问题是,我想要终止第一个线程,以及启动画面。似乎新的主应用程序线程没有获得应有的那种 "focus"。
发布这个是因为我确实找到了解决方案,尽管我觉得它更像是一个丑陋的 hack 而不是解决方案。我们没有处理闪屏表单(它会杀死关联的线程,只留下新线程 运行),而是显式终止线程;这显然有效,因为新表单(这是引擎的主体)会在当前 visual studio window 上方弹出,当它关闭时,线程终止,完整的 运行 项目关闭(这意味着我没有任何挥之不去的线程 运行)。
这是当前的解决方案:
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()" 在交换线程方面有什么区别?