C # / Winforms App замораживание / отставание - PullRequest
3 голосов
/ 24 февраля 2011

У меня есть приложение на C # / Winforms, которое в основном используется для запуска тестирования учетных записей клиентов в определенном порядке / настройке.Все они выполняются в браузерах, и поэтому я построил его так, чтобы он автоматизировал процесс, поскольку при каждом открытии учетной записи клиента необходимо запускать около 10-12 тестов.

В основном, что происходит с вами?введите номер учетной записи, затем он запустит тесты.

Вот пример кода.

public void startTestProcess()
    { 
        if (!cancelTests)
        {
            testRunning = true;
            var tabPage = createTabPage(banToRun, Convert.ToInt32(banToRun));
            loadingBox.Visible = true;
            mainTabControl.TabPages.Insert(0, tabPage);
            mainTabControl.SelectedTab = mainTabControl.TabPages[0];
            runTest(tabPage, banToRun);
            loadingBox.Visible = false;
        }
    }

private void runTest(TabPage t, string ban)
    {
        if (!cancelTests && !cancelCurrentOnly)
        {
            var tC = createInitialTabControl();
            t.Controls.Add(tC);
            int[] theTests = profileInfo.getSetList;
            for (int i = 0; i < theTests.Length; i++)
            {
                if (!cancelTests && !cancelCurrentOnly)
                {
                    var newTab = createTabPage(urlStrings.getName(theTests[i]), theTests[i]);
                    tC.TabPages.Add(newTab);
                    var webBrowser = createBrowser(urlStrings.getUrl(theTests[i], ban));
                    newTab.Controls.Add(webBrowser);
                    if (theTests[i] != 0 && theTests[i] != 1 && theTests[i] != 6
                        && theTests[i] != 11 && theTests[i] != 12)
                    {
                        if (!webBrowser.IsDisposed)
                        {
                            try
                            {
                                while (webBrowser.ReadyState != WebBrowserReadyState.Complete)
                                {
                                    Application.DoEvents();
                                }
                            }
                            catch
                            {
                                //Do Nothing
                            }
                        }
                    }
                    IntPtr pHandle = GetCurrentProcess();
                    SetProcessWorkingSetSize(pHandle, -1, -1);
                }
            }
        }
        if (cancelCurrentOnly)
        {
            cancelCurrentOnly = false;
        }
        banToRun = string.Empty;
        testRunning = false;

    }

Итак, в основном мой вопрос, как я могу оптимизировать то, что у меня есть, чтобы

A.Уменьшение задержки / зависания - Примечание. Уже реализован способ принудительного сбора мусора после каждого запуска теста.B. Возможно, улучшить производительность элементов управления WebBrowser?- Уже пробовал некоторые альтернативы веб-браузера, такие как WebKit для C # Wrapper (не работает на всех тестах из-за некоторого кодирования на основе ajax, я полагаю) C. Возможно, реализовывать многопоточные операции.Не уверен, как бы я поступил так, не выкинув перекрестные исключения.

Спасибо за вашу помощь.Если у вас есть другие вопросы, не стесняйтесь спрашивать.

Ответы [ 2 ]

6 голосов
/ 24 февраля 2011

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

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

Обновление

Этот вопрос посвящен проблеме обновления пользовательского интерфейса на основе прогресса работников.

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

2 голосов
/ 24 февраля 2011

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

Попробуйте выполнить рефакторинг этого приложения для работы в нескольких потоках.Основной поток должен быть максимально доступен для реагирования на пользовательские события.Фоновые потоки должны выполнять тяжелую работу по созданию дорогих объектов, выполнению длительных операций чтения / записи и т. Д.

...