繁体   English   中英

C#:同步运行多个请求

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM