C#/ Winforms App冻结/滞后

Ale*_*lex 3 c# multithreading freeze lag winforms

我在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;

    }
Run Code Online (Sandbox Code Playgroud)

所以基本上我的问题是,我怎样才能优化我拥有的东西

A.减少滞后/冻结 - 注意:在每次测试运行后,已经实施了一种强制垃圾收集的方法.B.可能提高WebBrowser控件的性能? - 已经尝试过一些web浏览器替代方案,比如WebKit for C#Wrapper(由于我认为基于ajax的编码,因此不适用于所有测试)C.也许实现多线程操作.如果没有抛出跨线程异常,我不确定如何解决这个问题.

谢谢你的协助.如果您有任何其他问题,请随时提出.

Mar*_*ius 6

滞后/冻结问题是由于您没有使用多个线程引起的; 因此,所有测试运行都使用UI线程,因此UI在运行测试时无法响应.

如果您不使用backround worker的原因是您担心抛出跨线程异常,那么您只需要确保在线程之间正确传递信息(而不是完全避免多线程).

更新

问题解决了根据工作人员的进度更新UI的问题.

作为旁注,你不应该强迫垃圾收集; 大多数情况下,这实际上会降低性能.垃圾收集器专门设计用于在可用时(当CPU可用时)收集.强制它运行需要周期远离你的应用程序尝试的实际工作.