0

我正在使用来自Here的启动画面。我喜欢它的简单。但它的问题是,在我点击它之前,闪屏不会消失。在 IDE 中运行时,它工作正常。有任何想法吗?我会在此处附上代码,但由于某种原因它没有正确插入。

private System.Windows.Forms.Timer timer1;
//private Splash sp=null;

public Form1()
{
    InitializeComponent();

    Thread th = new Thread(new ThreadStart(DoSplash));
    //th.ApartmentState = ApartmentState.STA;
    //th.IsBackground=true;
    th.Start();
    Thread.Sleep(3000);
    th.Abort();
    Thread.Sleep(1000);
}

private void DoSplash()
{
    Splash sp = new Splash();
    sp.ShowDialog();
}

private void timer1_Tick(object sender, System.EventArgs e)
{
//      sp.Close();
}
4

3 回答 3

6

首先,使用Thread.Abort在该页面上完成启动画面的方式不是正确的做事方式。

切勿调用Thread.Abort,除非您正在关闭线程所在的AppDomain 。

让我再次强调这一点。您应该调用Thread.Abort的唯一时间是当您对Thread.Abort及其行为有足够的了解时,知道您永远不应该调用它。

看看 StackOverflow 上的另一个问题:C# 中的多线程启动画面?.


如果您想保留现有解决方案,一种可能的更好方法是将计时器放入启动屏幕表单,将其计时器设置为您希望启动屏幕停留在屏幕上的时间,然后在其 Tick 事件处理程序中调用Close 。

在同一地点,我会简单地关闭原始线程,并删除其他行。

换句话说,从该页面的第一个代码块开始,我会保留这两行:

Thread th = new Thread(new ThreadStart(DoSplash));
th.Start();

将它与表单上的计时器相结合,使表单自动关闭,你的状态比试图掌握 Thread.Abort 更好。

你不应该打电话。

于 2009-06-01T22:29:33.057 回答
2

DoSplash 可能应该调用sp.Show()而不是 sp.ShowDialog()

但是从主线程调用 Sleep(x000) 来显示启动屏幕并不是很有效,并且应该保留 Thread.Abort() 以便更好地使用。

更好的方法是使用 Timer 关闭 SplashForm 并设置最小延迟。在启动时,您可以 Show() 和 Update() SplahForm 并继续加载内容。在 MainForm 完成初始化并进入 EventLoop 之前,计时器事件不会触发。不需要线程,也不需要涉及 MainForm。

只是为了给你一个 MessageLoop 驱动的 SplashForm 的主要成分:

public partial class SplashForm : Form
{
    //  default stuff

    public static void Splash()
    {
        var s = new SplashForm();
        s.Show();
        s.Update();// force paint
    }

    private void SplashForm_Load(object sender, EventArgs e)
    {
        Timer t = new Timer();
        t.Interval = 1; // wait for EventLoop
        t.Tick += GoAway;
        t.Enabled = true;
    }

    private void GoAway(object sender, EventArgs e)
    {
        this.Close();
    }
}

然后,在 Program.cs 中,

Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
SplashForm.Splash();
Application.Run(new MainForm());
于 2009-06-01T22:29:09.127 回答
1

这是一个丑陋的实现。你应该看看这个 SO 线程。这描述了如何使用 C# 中的 VisualBasic.NET 命名空间和OnCreateSplashScreen方法来实现更清晰的启动画面。

于 2009-06-01T22:29:14.867 回答