首页 > 解决方案 > 为什么我的主窗体需要 20 多秒才能可见?

问题描述

我一定遗漏了一些明显的东西,但我根本不明白为什么我的 Windows 窗体应用程序中的主窗体需要 20 秒才能显示出来。我的程序试图采用我在控制台应用程序示例中找到的 TPL 代码示例,并在 Windows 窗体/gui 中运行。我知道任务的排队需要 20 秒才能完成,但是那段代码是否发生得如此之快以至于表单没有时间完成初始化?我尝试在“InitializeComponent();”之后立即延迟 希望它能让表格有时间出现;并且还尝试在之后放置一个消息框,但在我插入延迟后仍然得到相同的延迟。没有 form_load 方法,所以没有什么可以检查的。

public partial class Form1 : Form
{

    public Form1()
    {
        InitializeComponent();

        // Time the test(s) 
        Stopwatch stoppwatch = new Stopwatch();
        stoppwatch.Start();

        Console.SetOut(new ControlWriter(tb1)); // just redirects console.writeline to the form's textbox "tb1"

        // #################################### job queue ########################################
        var q = new TPLDataflowMultipleHandlers();  //
        var numbers = Enumerable.Range(1, 10);

        foreach (var num in numbers)
        {
            F1TimeDelay(2);
            q.Enqueue(num.ToString());
        }

        // Stop the timer and return the elapsed number of milliseconds.
        stoppwatch.Stop();
        Console.WriteLine("XXXXXXXXXX  <STATUS> Elapsed time = {0} minutes. XXXXXXXXXX", (int)stoppwatch.Elapsed.TotalMinutes);
    }

顺便说一句,当表单最终出现时,文本框充满了我希望从启动的线程中看到的消息(线程 ID 等信息)。

F1TimeDelay(2) 是 2 秒延迟,而排队的作业只是 10 秒长的任务,以演示并行运行的 10 个任务。发送到队列的编号最终成为 10 个任务的作业编号。

标签: c#winformstask-parallel-library

解决方案


因为在构造函数和 FormShown 事件之间的某个地方,您正在调用需要 20 多秒才能完成的代码。

虽然我在构造函数中什么都看不到,但这只是加载过程的开始:https ://docs.microsoft.com/en-us/dotnet/framework/winforms/order-of-events-in-windows-形式

通常,您应该检索任何数据或执行其他任何操作的最早时刻是在Shown Event 中。即使这样,像这样的长时间运行的操作也应该通过某种形式的多任务/异步操作来完成。您必须弄清楚它是什么,但我的猜测是磁盘或网络/数据库访问。

如果您希望进行测量并希望得到正确性,则需要在构造函数中启动秒表,并且只在 Shown 中停止/显示结果。即便如此,您的 Shown Event 也可能是第一个被调用的事件,稍后会进行艰苦/长期的工作,因此它可能会错过导致问题的任何原因。您的秒表也不包括设计师创建的元素。Designer 代码使用 InitializeComponents() 执行。当然,在这种数量级的延迟下,定期输出 DateTime.Now 应该是可行的。


推荐阅读