Почему моя основная форма занимает более 20 секунд, чтобы стать видимой? - PullRequest
0 голосов
/ 06 ноября 2019

Я, должно быть, упускаю что-то очевидное, но я просто не понимаю, почему моя основная форма в моем приложении Windows Forms отображается 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);
    }

Кроме того, когда форма, наконец, появляется, текстовое поле заполнено сообщениями, которые я ожидал увидеть иззапущенные потоки (информация, такая как идентификатор потока и т. д.).

F1TimeDelay (2) - задержка в 2 секунды, в то время как задания в очереди - это всего лишь 10-секундные задачи для демонстрации 10 задач, работающих параллельно. Числа, отправленные в очередь, в итоге становятся номерами заданий для 10 задач.

Ответы [ 2 ]

3 голосов
/ 06 ноября 2019

Поскольку где-то между Конструктором и FormShown Event, вы вызываете код, выполнение которого занимает более 20 секунд.

Хотя я ничего не вижу в конструкторе, это буквально только начало процесса загрузки:https://docs.microsoft.com/en-us/dotnet/framework/winforms/order-of-events-in-windows-forms

Как правило, самый ранний момент, когда вы должны получить какие-либо данные или сделать что-либо еще, это событие Показано . И даже в этом случае длительная операция, такая как эта, должна выполняться с использованием некоторой формы многозадачной / асинхронной операции. Вы должны выяснить, что это такое, но я предполагаю, что для доступа к диску или сети / базе данных.

Если вы хотите выполнять измерения с надеждой на корректность, вам нужно запустить StopWatch в конструкторе,и только остановить / показать результат в Показано. И даже тогда ваше Показанное Событие может быть первым, вызванным после тяжелой / долгой работы, поэтому оно может пропустить все, что вызывает проблемы. Ваш секундомер также не включает созданные дизайнером элементы. Код конструктора выполняется с помощью InitializeComponents (). Конечно, с задержкой на такой порядок величины может быть целесообразным просто вывести DateTime.Now regulary.

1 голос
/ 06 ноября 2019

Форма будет отображаться через некоторое время после завершения конструктора. Если вы поместите в очередь долго выполняющийся код очереди задач, то форма не будет отображаться до тех пор, пока не будет выполнен этот долго работающий код. Вместо этого добавьте кнопку в форму и создайте для нее обработчик кликов. поместите там длинный код. Затем форма появится и вы можете нажать на кнопку. Но тогда форма застынет из-за очереди задач, я думаю.

...