0

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

我进行了搜索,但不确定如何在我的代码中实现。我也遇到了 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();
    }
}
4

1 回答 1

1

您会竭尽全力为您的启动画面启动一个单独的线程,这意味着您有正确的想法。问题是实施有点偏离。调用Thread.Sleep实际上使当前线程休眠,因此您的主 UI 线程完全死掉了大约 5 秒,当它应该做的是在显示启动屏幕时在后台加载主窗体时,什么也不做。返回后Thread.Sleep,您调用Application.Run以启动主窗体,但到那时为时已晚 - 只要代码告诉它,启动屏幕就已经保持不变并且它会自行关闭。

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

如果您可以在后台同时进行冗长的验证时实际显示启动屏幕,那不是很好吗?确实,这是启动画面的“正确”实现,但要使其正常工作非常困难。UI 代码中的同步和跨线程很难编写,甚至更难调试。

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

这个框架会自动为你处理一切,你需要做的就是为它提供一个闪屏表单类(你似乎已经有了,命名为frmSplashScreen)。您可以在我的回答中找到完整的使用说明,包括示例代码。

于 2013-03-16T07:33:33.083 回答