在主屏幕完成过程之前关闭启动画面

时间:2013-03-16 07:09:56

标签: c# winforms

我有一个启动画面,在我的主表单加载之前加载。发生的事情是在主屏幕加载之前关闭闪屏。我添加了启动画面,因为我的应用程序需要一段时间才能根据许可证密钥加载我发布的帖子here

我搜索但不确定如何在我的代码中实现。我也遇到了Backgroundworker,但又不确定如何继续。

主要代码:

static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Thread th = new Thread(new ThreadStart(ShowSplashScreen));
    th.Start();
    Thread.Sleep(5000);
    Application.Run(new frmMain());
    th.Abort();
}

static void ShowSplashScreen()
{
    Application.Run(new frmSplashScreen());
}

启动画面:

以表格加载

timer1.Start();
timer1.Interval = 600;
progressBar1.Maximum = 10;

private void timer1_Tick(object sender, EventArgs e)
{
    if (progressBar1.Value != 10)
    {
        progressBar1.Value++;
    }
    else
    {
        timer1.Stop();
        timer1.Enabled = false;
        this.Close();
    }
}

1 个答案:

答案 0 :(得分:1)

您需要花费所有精力为启动画面启动一个单独的线程,这意味着您有正确的想法。问题是实施有点偏。对Thread.Sleep的调用实际上会休眠当前的线程,所以你的主UI线程已经完全死了大约5秒钟,当它应该做什么时什么都不做在显示初始屏幕时正在后台加载主窗体。在Thread.Sleep返回后,您调用Application.Run来启动主窗体,但到那时已经太晚了 - 只要代码告诉它并且它自己关闭,启动屏幕就已经停止了。

你可以通过将调用Thread.Sleep移动到启动画面线程来解决问题,但这是一个非常丑陋和黑客的方法,说实话。除了睡眠线程的固有问题之外,启动屏幕的真正要点(正如您自己所承认的)是为用户提供视觉上有趣的东西,并在您完成一些冗长的任务时让人放心。大多数用户并不特别喜欢启动画面(好吧,实际上,似乎大多数人都讨厌它们),但它们确实有一个目的,尽管是有限的。当你使用像Thread.Sleep这样的东西时,有效地迫使你的闪屏在屏幕上无所事事,你只是在旋转CPU周期并且无缘无故地浪费用户的时间。他们对此不会那么宽容。我敢肯定,这可能不是你的计划,但往往最终会发生这种情况。

如果你在背景中同时进行冗长的验证时实际显示启动画面会不会很好?实际上,这是启动画面的“正确”实现,但要使其正常工作非常困难。 UI代码中的同步和交叉线程编写起来很棘手,甚至难以调试。

相反,我建议你踢。翻录你的代码以手动显示启动画面及其所有Thread.Sleep丑陋,而不是用内置的启动画面框架替换它。大多数人都不知道,因为狡猾的微软程序员将它隐藏在Microsoft.VisualBasic命名空间下,而C#人员无法找到它。不过,不要让那个骗过你。它与C#应用程序完美配合,让您的生活更加轻松。那些VB.NET人为什么要为自己囤积所有好东西?

此框架将自动为您处理所有事情,您需要做的就是为它提供一个启动画面窗体类(您似乎已经拥有它,名为frmSplashScreen)。您可以在my answer here中找到有关使用它的完整说明,包括示例代码。