c#winform项目中的一个表单阻塞另一个表单

c#winform项目中的一个表单阻塞另一个表单,c#,winforms,forms,blocking,C#,Winforms,Forms,Blocking,我有一个应用程序,它使用两个表单,一个主表单和一个启动表单,用于以下配置: public class MainForm : Form { public MainForm() { SplashScreen splash = new SplashScreen(); // configure Splash Screen } } public class SplashScreen { public SplashScreen() {

我有一个应用程序,它使用两个表单,一个主表单和一个启动表单,用于以下配置:

public class MainForm : Form
{
    public MainForm()
    {
       SplashScreen splash = new SplashScreen();

       // configure Splash Screen
    }
}


public class SplashScreen
{
    public SplashScreen()
    {
       InitializeComponent();

       // perform initialization

       this.ShowDialog();
       this.BringToFront();
    }
}
注意:主窗体是使用以下代码创建的:

Application.Run( new MainForm() );
上面的问题是,除非使用关闭splash,否则不会出现splash配置

splash.Close();

只有在这种情况下,MainForm构造函数的其余部分才会运行。如何轻松停止这种阻塞行为?

使用splash.Open()而不是splash.OpenDialog(),这不会发生。

通常,您需要在单独的线程上显示启动屏幕,并让主线程继续加载。非常重要-特别是,您需要使用
控件。调用
请求启动屏幕在准备就绪时自动关闭(线程关联).

基本上,您只想显示启动窗体,而不想让它阻止主窗体

我是这样做的:

class MainForm : Form {

    SplashScreen splash = new SplashScreen();  //Make your splash screen member

    public MainForm()
    {
        splash.Show();  //Just show the form
    }

}
然后在MainForm_加载中,按正常方式进行初始化

现在,当您的表单准备好显示时(显示MainForm_):


这样可以在显示启动屏幕时正常加载主窗体。

我已经用一个工作示例回答了您提出的另一个问题:


似乎该错误可能在SplashScreen构造函数内部。你能把密码也发出来吗?抱歉。这是一个与上述问题不同的问题,尽管您说您的解决方案可能也适用于此问题是正确的。我得试一试。
public MainForm_Shown()
{
    splash.Close();
}