1

IWebDrivervsの並列実行をテストしていWebClientます。(パフォーマンスの違いとその大きさがある場合)

なんとかそうする前に、単純なWebClient-並列呼び出しで問題が発生しました。

実行されていないようですがAgilityPacDocExtraction 、の特定のラインにブレーキポイントを入れましたWebClient.DownloadString(URL)

ただし、デバッグの代わりにプログラムが終了すると、Step Intoyeald文字列が表示される可能性があります。

計画では、各アクションの「モード」セレクターを介して、実行する必要のあるすべてのアクションに対して単一のメソッドを用意し、次に、使用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;

        }
     }

保持WebClientし、 IWebDriver(セレンによって)ここに含まれていないクラスなので、この投稿でもう少しスペースを取ることはなく、今のところ関係ありません。

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から抽出された値を介して変更されるはずのファイル内のコンテンツが表示されないことです。さらに、デバッグモードでは、上記のコードでコメントされた行にステップインできませんでした。私はここで何を間違っていますか?

4

2 に答える 2

1

関数Download(url, htmlDictionary)は上記のコードでは定義されていません。考えられるバージョンの 1 つは次のとおりです。

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

...上記のコードは、別のスタック オーバーフローの投稿からのコピーのようです。参照については 、タスク並列を使用して html ドキュメント ソースを含む文字列を取得するを参照してください。

于 2014-07-04T01:28:12.553 に答える
0

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;
    }

}
于 2012-11-24T02:10:17.683 に答える