[英]C#: Running multiple requests synchronously
我正在尝试让多个浏览器同时运行任务。 我创建了一种测试应用程序,目的只是看我是否可以自己完成这项任务。 我做得很好,但似乎速度变慢了很多,并且它在第一个浏览器完成加载之前等待第一个浏览器完成。
在有人建议使用WebBrowser之外的其他方式之前,我只想说说我选择WebBrowser的决定有充分的理由。
我有一个名为“ Slave”的类来向Google运行请求,我使用以下代码创建它们:
public void LoadSlaves()
{
for (int i = Program.GetServer().GetConfigHandler().GetValueByKeyInt("slaves_count"); i > 0; i--)
{
_slaves.Add(_slaves.Count, new Slave());
}
Logger.Warn("Loaded " + _slaves.Count + " slaves.");
}
public void StartSlaves()
{
foreach (var slave in _slaves.Values)
{
slave.Start();
}
}
类:
using NLog;
using System;
using System.Threading;
using System.Windows.Forms;
namespace Test.Root.Base.Slaves
{
class Slave
{
private static readonly ILogger Logger = LogManager.GetCurrentClassLogger();
private Thread _slaveThread;
private WebBrowser _browser;
public Slave()
{
}
public void Start()
{
_slaveThread = new Thread(new ThreadStart(OnCycle));
_slaveThread.SetApartmentState(ApartmentState.STA);
_slaveThread.Start();
}
public void OnCycle()
{
while (true)
{
if (_browser == null)
{
_browser = new WebBrowser();
_browser.ScriptErrorsSuppressed = true;
_browser.DocumentCompleted += browser_DocumentCompleted;
_browser.Navigate("http://google.com");
Application.Run();
}
}
}
private void browser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
if (_browser.Url == e.Url)
{
Logger.Trace("Navigated to {0} on " + Thread.CurrentThread.ManagedThreadId, e.Url);
_browser.Navigate("http://google.com");
}
}
}
}
这里是一些日志记录:
22:17:56 - Navigated to https://www.google.co.uk/?gfe_rd=cr&ei=f0KfWZ29L8HHXo_vm_gI&gws_rd=ssl on 7
22:17:58 - Navigated to https://www.google.co.uk/?gfe_rd=cr&ei=gkKfWdzoAcjHXpyEl2g&gws_rd=ssl on 8
22:18:01 - Navigated to https://www.google.co.uk/?gfe_rd=cr&ei=g0KfWaffJMjHXpyEl2g&gws_rd=ssl on 7
22:18:02 - Navigated to https://www.google.co.uk/?gfe_rd=cr&ei=hUKfWd33KMjHXpyEl2g&gws_rd=ssl on 8
22:18:06 - Navigated to https://www.google.co.uk/?gfe_rd=cr&ei=iUKfWf6xE8jHXpyEl2g&gws_rd=ssl on 8
22:18:07 - Navigated to https://www.google.co.uk/?gfe_rd=cr&ei=iEKfWfPPFMjHXpyEl2g&gws_rd=ssl on 7
22:18:10 - Navigated to https://www.google.co.uk/?gfe_rd=cr&ei=jUKfWcHGLMjHXpyEl2g&gws_rd=ssl on 7
22:18:12 - Navigated to https://www.google.co.uk/?gfe_rd=cr&ei=jUKfWdbLB8jHXpyEl2g&gws_rd=ssl on 8
22:18:15 - Navigated to https://www.google.co.uk/?gfe_rd=cr&ei=kEKfWezHPMjHXpyEl2g&gws_rd=ssl on 7
22:18:16 - Navigated to https://www.google.co.uk/?gfe_rd=cr&ei=kkKfWe35OcjHXpyEl2g&gws_rd=ssl on 8
正如您所看到的,它在两次请求之间等待了几秒钟(通常是2-3秒),如何使两个浏览器同时同步运行?
因为线程启动永远不会关闭,您是否会变慢。 看起来您不再需要它了,但它仍在循环。 我以前从未使用过WebBrowser,但是,除非有充分的理由,否则您所做的任何线程都应让它正常完成。 这样的事情对您有用吗?
...
public void OnCycle()
{
while (_browser == null)
{
...
同样是为了澄清,是否只有许多_slaves运行会变慢?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.