【问题标题】:WebClient download string (a few chars page) is so slowWebClient 下载字符串(几个字符页面)太慢了
【发布时间】:2015-02-20 14:16:08
【问题描述】:

我正在尝试从 URL 下载字符串。不幸的是,它很慢。

这是我的代码:

    // One of these types for two bad solutions anyway
    // byte[] result = new byte[12];
    // string result;
    using (var webClient = new System.Net.WebClient())
    {
        String url = "http://bg2.cba.pl/realmIP.txt";
        //result = webClient.DownloadString(url); // slow as hell
        //webClient.OpenRead(url).Read(result, 0, 12); // even slower
    }

大概需要4-5秒,这对我来说似乎很不合适......

这个url的内容是IP

 XX.YYY.ZZ.FF

【问题讨论】:

  • 你用过 Wireshark 或类似的东西来看看时间都去哪儿了?
  • 我没用过WS因为不知道怎么操作
  • @BartłomiejSobieszek 然后读入 Wireshark
  • 我刚刚测试了您的代码,它似乎运行得尽可能快。你有防火墙或中间的东西吗?
  • 好的,我解决了这个问题,我必须将代理设置为 null :)

标签: c# performance webclient downloadstring


【解决方案1】:

我尝试了您的代码并添加了一些输出。

        using (var webClient = new System.Net.WebClient())
        {
            Stopwatch timer = Stopwatch.StartNew();
            String url = "http://bg2.cba.pl/realmIP.txt";
            timer.Stop();
            TimeSpan timespan = timer.Elapsed;
            String tex1 = String.Format("{0:00}:{1:00}:{2:00}", timespan.Minutes, timespan.Seconds, timespan.Milliseconds / 10);


            timer = Stopwatch.StartNew();
            String result = webClient.DownloadString(url); // slow as hell
            timespan = timer.Elapsed;
            String tex2 = String.Format("{0:00}:{1:00}:{2:00}", timespan.Minutes, timespan.Seconds, timespan.Milliseconds / 10);


            timer = Stopwatch.StartNew();
            Stream stream = webClient.OpenRead(url);
            timespan = timer.Elapsed;
            String tex3 = String.Format("{0:00}:{1:00}:{2:00}", timespan.Minutes, timespan.Seconds, timespan.Milliseconds / 10);

            timer = Stopwatch.StartNew();
            byte[] result2 = new byte[12];
            int val = webClient.OpenRead(url).Read(result2, 0, 12); // even slower
            timespan = timer.Elapsed;
            String tex4 = String.Format("{0:00}:{1:00}:{2:00}", timespan.Minutes, timespan.Seconds, timespan.Milliseconds / 10);

            textBox1.Text = result;
            t1.Text = tex1;
            t2.Text = tex2;
            t3.Text = tex3;
            t4.Text = tex4;
        }

结果如下

您的代码似乎没问题。 检查你的防火墙和所有相关的东西

【讨论】:

    【解决方案2】:

    已修复,我猜很抱歉把这个问题放在这里,但是......这是工作代码

    string result;
    using (var webClient = new System.Net.WebClient())
    {
        webClient.Proxy=null;
        String url = "http://bg2.cba.pl/realmIP.txt";
        result = webClient.DownloadString(url);
    }
    

    只需将代理设置为空

    【讨论】:

    • 使用 GlobalProxySelection.GetEmptyWebProxy() 而不是 null。阅读我的答案了解更多详情
    • 我不得不使用“client.Proxy = null;”来让我的代码运行得更快。 (C#)
    • webClient.Proxy=null;这对我有用
    【解决方案3】:

    很明显是你线路/pc/防火墙的问题

    您可以在线测试:

    http://goo.gl/XRqLjn

    大约需要 500 毫秒

    自己回答后更新

    如果您不想使用代理,您应该使用GetEmptyWebProxy(),如msdn 所述:

    webClient.Proxy=GlobalProxySelection.GetEmptyWebProxy();
    

    【讨论】:

    • 注意:尽管GlobalProxySelection.GetEmptyWebProxy() 已被弃用,但这是我能够加快 WebClient 请求的唯一方法。如果有人知道实现相同行为的任何不被弃用的方法,请告诉我。
    • 他们建议现在将 .Proxy 设置为“null”
    猜你喜欢
    • 2014-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多