作为任务 (TPL) 多次并行执行 WebClient



我正在测试IWebDriverWebClient的并行执行。 (如果存在性能差异以及差异有多大)

在我设法这样做之前,我在简单的WebClient-并行调用方面遇到了问题。

似乎还没有执行,我确实在AgilityPacDocExtraction上放了一个刹车点 在特定的WebClient.DownloadString(URL)

但程序退出 而不是调试Step Into可以显示Yeald字符串。

计划是对所有需要采取的行动采用单一方法, 通过每个动作的"模式"选择器, 然后使用一个简单的foreach,它将迭代所有可用的Enum values- 模式

主要内容:

static void Main(string[] args)
{
EnumForEach<Action>(Execute);
Task.WaitAll();
}
public static void EnumForEach<Mode>(Action<Mode> Exec)
{
foreach (Mode mode in Enum.GetValues(typeof(Mode)))
{
Mode Curr = mode;
Task.Factory.StartNew(() => Exec(Curr) );
}
}

模式/动作选择器

enum Action
{
Act1, Act2
}

实际执行

static  BrowsresFactory.IeEngine IeNgn = new BrowsresFactory.IeEngin();
static string 
FlNm = Environment.CurrentDirectory,
URL = "",
TmpHtm ="";

static void Execute(Action Exc)
{

switch (Exc)
{
case Action.Act1:
break;
case Action.Act2:
URL  = "UrlofUrChoise here...";
FlNm += "\TempHtm.htm";
TmpHtm = IeNgn.AgilityPacDocExtraction(URL).GetElementbyId("Dv_Main").InnerHtml;
File.WriteAllText(FlNm, TmpHtm);
break;
}
}

持有WebClientIWebDriver(硒)的类不包括在这里,所以在这篇文章中不会占用更多空间,所以暂时不相关。

class BrowsresFactory
{
public class IeEngine
{
private WebClient WC = new WebClient();
private string tmpExtractedPageValue = "";
private HtmlAgilityPack.HtmlDocument retAglPacHtmDoc = new HtmlAgilityPack.HtmlDocument();
public HtmlAgilityPack.HtmlDocument AgilityPacDocExtraction(string URL)
{
WC.Encoding = Encoding.GetEncoding("UTF-8");
tmpExtractedPageValue = WC.DownloadString(URL); //<--- tried to break here
retAglPacHtmDoc.LoadHtml(tmpExtractedPageValue);
return retAglPacHtmDoc;
}
}
}

问题是我看不到文件中应该通过从 WebClient 提取的值更改的任何内容,而且在调试模式下我无法进入上面代码中注释的行。 我在这里做错了什么?

上面的代码中没有定义函数Download(url, htmlDictionary),一个可能的版本是:

private static void Download(string url, ConcurrentDictionary<string, string> htmlDictionary)
{
using (var webClient = new SmartWebClient())
{
htmlDictionary.TryAdd(url, webClient.DownloadString(url));
}
}

。上面的代码似乎是另一个堆栈溢出帖子的副本。有关参考,请参阅使用任务并行检索包含 html 文档源的字符串

我已经设法通过使用WebClient来解决这个问题,我认为这需要的资源比WebDriver少,如果这是真的,这也意味着需要更少的时间。

这是代码:

public void StartEngins()
{
const string URL_Dollar = "URL_Dollar";
const string URL_UpdateUsersTimeOut = "URL_UpdateUsersTimeOut";

var urlList = new Dictionary<string, string>();
urlList.Add(URL_Dollar, "http://bing.com");
urlList.Add(URL_UpdateUsersTimeOut, "http://localhost:..../.......aspx");

var htmlDictionary = new ConcurrentDictionary<string, string>();
Parallel.ForEach(
urlList.Values,
new ParallelOptions { MaxDegreeOfParallelism = 20 },
url => Download(url, htmlDictionary)
);
foreach (var pair in htmlDictionary)
{
///Process(pair);
MessageBox.Show(pair.Value);
}
}
public class SmartWebClient : WebClient
{
private readonly int maxConcurentConnectionCount;
public SmartWebClient(int maxConcurentConnectionCount = 20)
{
this.maxConcurentConnectionCount = maxConcurentConnectionCount;
}
protected override WebRequest GetWebRequest(Uri address)
{
var httpWebRequest = (HttpWebRequest)base.GetWebRequest(address);
if (httpWebRequest == null)
{
return null;
}
if (maxConcurentConnectionCount != 0)
{
httpWebRequest.ServicePoint.ConnectionLimit = maxConcurentConnectionCount;
}
return httpWebRequest;
}
}

相关内容

  • 没有找到相关文章

最新更新