我在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;
}
基本上我的问题是,我如何优化我拥有的东西
一个。减少滞后/冻结 - 注意:在每次测试运行后,已经实现了强制垃圾收集的方法。 B.可能提高WebBrowser控件的性能? - 已经尝试了一些web浏览器替代品,比如WebKit for C#Wrapper(由于我认为基于ajax的编码,因此无法在所有测试中使用) C.也许实现多线程操作。如果没有抛出跨线程异常,我不确定如何解决这个问题。
感谢您的协助。如果您有任何其他问题,请随时提出。
答案 0 :(得分:6)
滞后/冻结问题是由不使用多个线程引起的;因此,所有测试运行都使用UI线程,因此UI在运行测试时无法响应。
如果您不使用backround worker的原因是您担心抛出跨线程异常,那么您只需要确保在线程之间正确传递信息(而不是避免多线程)共)。
<强>更新强>
This问题解决了根据员工进度更新用户界面的问题。
作为旁注,你不应该强迫垃圾收集;大多数情况下,这实际上会降低性能。垃圾收集器专门设计用于在可用时(当CPU可用时)收集。强制它运行需要一些时间远离你的应用程序试图做的实际工作。
答案 1 :(得分:2)
我看到在处理GUI的方法中执行了很多繁重的工作,因此我假设所有这些都是在应用程序的主线程中完成的(这将在执行与该WebBrowser相关的非图形操作时阻塞其他地区)。
尝试重构此应用程序以在多个线程中运行。主线程应尽可能地响应用户事件。后台线程应该负责创建昂贵的对象,执行长时间运行的读/写操作等等。