为什么我的主表单需要20秒钟以上才能可见?

我必须缺少明显的东西,但是我根本不明白为什么Windows Forms Application中的主表单需要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个任务的作业编号。

chenhongyi2009 回答:为什么我的主表单需要20秒钟以上才能可见?

由于在Constructor和FormShown事件之间的某个地方,您正在调用需要20秒钟以上才能完成的代码。

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

通常,您应该在Shown事件中最早获取任何数据或执行其他任何操作。即使这样,也应该使用某种形式的多任务/异步操作来完成诸如此类的长时间运行的操作。您必须弄清楚它是什么,但是我的猜测是针对磁盘或网络/数据库访问。

如果希望进行校正,则需要在构造函数中启动StopWatch,并且仅在Shown中停止/显示结果。而且即使如此,您的Shown Event可能还是第一个被调用的事件,稍后会进行艰苦/漫长的工作,因此它可能会错过任何导致问题的原因。您的秒表也不包含设计器创建的元素。设计器代码通过InitializeComponents()执行。当然,如果以这样的数量级延迟,则仅输出DateTime应该是可行的。现在定期输出。

,

在构造函数完成后的某个时间将显示该表单。如果将长时间运行的任务队列代码放入构造函数中,则在完成此长时间运行的代码之前,不会显示该表单。 而是将一个按钮添加到窗体并为其创建一个单击处理程序。将长期运行的代码放在此处。然后将显示该表格,您可以单击按钮。但由于任务排队,表单可能会冻结。

本文链接:https://www.f2er.com/3150070.html

大家都在问