C # Threading UI для диалога ожидания - PullRequest
1 голос
/ 20 сентября 2011

Хорошо.Я осмотрел некоторые из них, пытаясь проделать свой пользовательский интерфейс, чтобы заставить это работать.

У меня есть приложение для сообщения информации.Как это работает, что я пользовательский элемент управления, который может повторяться в прокручиваемой области.поэтому, если за день загружается 10 отчетов, он будет загружать этот элемент управления 20 раз в прокручиваемой области.

Я хотел бы создать диалоговое окно «Пожалуйста, подождите» при загрузке этих элементов управления.Но, по-видимому, существует проблема, связанная с тем, что пользовательский интерфейс в потоке в режиме Marquee не анимируется при рисовании этих элементов управления, которые должны находиться в прокручиваемой области позади.

Попытка создать элементы управления в фоновом режиме, но это не поможетпроблема, когда дело доходит до индикатора выполнения.

Есть ли идеи или советы, когда дело доходит до многопоточности рисования пользовательского интерфейса?Как я полагаю, это то, что есть.Индикатор выполнения при рисовании других элементов управления.

РЕДАКТИРОВАТЬ: я пытался показать это диалоговое окно «Пожалуйста, подождите» как Show(); и ShowDialog();.ShowDialog () работает, но только потому, что приостанавливает работу остальных приложений, ожидая ответа.

Вот код, генерирующий элементы управления.это не многопоточная версия для фона.но единственная разница заключается в том, где в коде находится диалоговое окно "pleaseWait".

        /// <summary>
    /// Generates assignemts after date
    /// </summary>
    /// <param name="date">Date for selection of what to show</param>
    /// <param name="currentWeek">Week to show</param>
    /// <param name="igonerWeekCheck">Ignor week check, used for startup</param>
    private void GenerateAssigmentsAfterDate(DateTime date, int currentWeek, bool igonerWeekCheck)
    {
        //refresh UI before generating contens
        tabPage1.Refresh();
        panelScroller.Refresh();
        splitContainer1.Refresh();

        //freezes UI while loading
        SuspendDrawing(splitContainer1);
        panelScroller.SuspendLayout();

        if (CurrentTMEngine.LatestWeekNumber != GetWeekNumber(date) || igonerWeekCheck == true)
        {
            if (igonerWeekCheck == false)
            {
                pleaseWait = PleaseWaitDialog();
                pleaseWait.StartPosition = FormStartPosition.CenterParent;
                pleaseWait.Show();
                pleaseWait.Update();
            }

            //should remove current controls from memory
            int ctrlCount = panelScroller.Controls.Count;
            for (int i = 0; i < ctrlCount; i++)
            {
                panelScroller.Controls[0].Dispose();
            }

            panelScroller.Refresh();

            assignmentList.Clear();
            assignmentList = null;
            assignmentList = new List<messageCtrl>();

            int rowCountCtrl = 0;
            foreach (DataRow row in CurrentTMEngine.TMassignmentsTable.Rows)
            {
                if (currentWeek == GetWeekNumber(Convert.ToDateTime(row[new TableText().TimeStart]).Date))
                {
                    messageCtrl repCtrl = new messageCtrl(rowCountCtrl, Convert.ToInt32(row[new TableText().ID]),
                        Convert.ToDateTime(row[new TableText().TimeStart]), Convert.ToDateTime(row[new TableText().TimeEnd]),
                        panelScroller.Controls, CurrentTMEngine.TMassignmentsTable, row, CurrentTMEngine);
                    assignmentList.Add(repCtrl);//collection to be avalie for show
                    rowCountCtrl++;
                }
            }
            foreach (messageCtrl assign in assignmentList)
            {
                if (currentWeek == GetWeekNumber(assign.StartTime.Date))
                {
                    if (assign.StartTime.Date == date)
                    {
                        assign.Enabled = true;
                        assign.Height = 142;
                        assign.tableLayoutPanel2.BackColor = System.Drawing.SystemColors.ControlLightLight;
                    }
                    else
                    {
                        assign.Enabled = false;
                        assign.Height = 5;
                        assign.tableLayoutPanel2.BackColor = System.Drawing.SystemColors.ControlDark;
                    }
                    panelScroller.Controls.Add(assign); //ands control
                }
            }
            // SetSizeMessageCtrlByDate(date, currentWeek);


            pleaseWait.Close();
            pleaseWait.Dispose();
        }
        else
        {
            SetSizeMessageCtrlByDate(date, currentWeek);
        }
        CurrentTMEngine.LatestWeekNumber = GetWeekNumber(date);

        //unfrezzing UI
        panelScroller.ResumeLayout();
        ResumeDrawing(splitContainer1);
    }
    #endregion

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

Решением проблемы прямо сейчас является диалоговое окно «Пожалуйста, подождите» без анимированной полосы прокрутки Marquee.

Проверьте, есть ли способ создать отдельное приложение для этого, чтобы заполнить этокошелек, как это кажется единственным решением.

1 Ответ

3 голосов
/ 20 сентября 2011

У вас есть доступ к исходному коду для элементов управления?Похоже, что элементы управления используют поток пользовательского интерфейса для выполнения некоторого фонового процесса (вызывая задержку).К сожалению, существует только один поток пользовательского интерфейса, поэтому, если он связан, вы получите эффект задержки.

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

...