C# 闪屏线

C# 闪屏线,c#,winforms,splash-screen,C#,Winforms,Splash Screen,因此,我有一个启动屏幕,其中将有一些时间密集型代码,我不希望它在主线程中运行。我已经编写了一些代码,应该停止线程并关闭表单,但它不起作用。欢迎任何帮助 代码: 程序仅停留在该屏幕上: 编辑: 我可以使用以下代码修复此问题: Invoke((MethodInvoker)delegate { MyNextForm.Show(); }); 它在UI线程上调用MyNextForm.Show()。当线程中有thread.sleep时,主线程将继续执行代码 if (splashCont) { sp

因此,我有一个启动屏幕,其中将有一些时间密集型代码,我不希望它在主线程中运行。我已经编写了一些代码,应该停止线程并关闭表单,但它不起作用。欢迎任何帮助

代码:

程序仅停留在该屏幕上: 编辑: 我可以使用以下代码修复此问题:

Invoke((MethodInvoker)delegate { MyNextForm.Show(); });

它在UI线程上调用
MyNextForm.Show()

当线程中有thread.sleep时,主线程将继续执行代码

if (splashCont)
{
    splash.Abort();

    this.Close();
}
将在设置splashCnt=true之前执行

检查你是否真的需要睡眠线程,如果需要,然后需要考虑解决它

如果您真的想让线程休眠,那么可以让主线程等待子线程完成

while (splash.IsAlive)
{
    Thread.Sleep(1000);
}

if (splashCont)
{
    splash.Abort();
    this.Close();
}

如果您希望以启动屏幕的形式完成工作,可以大大简化。这假设您的五秒钟睡眠模拟正在进行的启动工作。这样,启动工作完成后,splash表单就会自动关闭

partial class Cobalt : Form
{
    public Cobalt()
    {
        this.Text = "Cobalt V1.0.0";
        this.Width = 400;
        this.Height = 100;
        this.BackgroundImage = Properties.Resources.cobaltlgo;
        this.FormBorderStyle = FormBorderStyle.None;
        this.TopMost = true;
        this.StartPosition = FormStartPosition.CenterScreen;
        this.Show();
        splashLoadAction();
        this.Close();
    }

    private void splashLoadAction()
    {
        Thread.Sleep(5000);
    }
}

你应该在闪屏窗体中放置一个计时器,并在时间过去后关闭它。您可能希望修改应用程序入口点,以便在启动主应用程序窗体之前显示此窗体

在实际应用程序中,如果您希望在应用程序未准备就绪或主窗体实际显示之前,保持飞溅显示更长时间,则可能会比这更复杂

如果需要时间来显示主应用程序窗口,这可能很有用,因为在启动关闭和应用程序可见之间的几秒钟内没有显示任何窗口,这可能会让用户认为应用程序已崩溃


使用计时器、空闲和可见性事件,一旦你了解了所有事情的工作原理,你可以做任何你想做的事情。

但是主线程停止,GUI不出现如果你不想放线程。在平均线程中睡眠,那么你可能不得不使用线程。从线程调用的方法中睡眠。什么是“不工作”意思是?另外,如果你调用
Thread.Abort()
,那么你做的事情非常错误,除非你试图强制关闭整个应用程序。好主意。我会考虑他们
partial class Cobalt : Form
{
    public Cobalt()
    {
        this.Text = "Cobalt V1.0.0";
        this.Width = 400;
        this.Height = 100;
        this.BackgroundImage = Properties.Resources.cobaltlgo;
        this.FormBorderStyle = FormBorderStyle.None;
        this.TopMost = true;
        this.StartPosition = FormStartPosition.CenterScreen;
        this.Show();
        splashLoadAction();
        this.Close();
    }

    private void splashLoadAction()
    {
        Thread.Sleep(5000);
    }
}