反复用到HttpWebRequest来获取网页源码(多线程的)  要怎么优化代码或有什么好的方法来提高访问速度...

解决方案 »

  1.   

    听说可以在提交前的HttpWebRequest对像中的头加入( "Accept-Encoding ",   "gzip "); 
    然后在解密 具体代码要怎么写呢
      

  2.   

    这个不是 Socket效率问题 不是这样考虑的
      

  3.   

    +1
    还有这个是在网上获取的``是在IE里面啊 代码再牛网速慢如牛你也没办法
    HttpWebRequest只是一个方法~ 你调用而已,如果你真想让这个方法少占点内存
    你看看它是从哪里派生出来的` 基类是什么`然后再想办法吧
      

  4.   

    给你一个多线程的版本的,不卡ui界面:using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Net;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using System.IO;
    using System.Threading;
    namespace test
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }        private static string str_url = string.Empty;
            public delegate void SetTextHandler(string text); 
            private void toolStripButton1_Click(object sender, EventArgs e)
            {
                if (toolStripTextBox1.Text.Length > 0)
                {
                    str_url = toolStripTextBox1.Text.Trim();
                    ParameterizedThreadStart ParStart = new ParameterizedThreadStart(GetPageSource);   
                    Thread myThread = new Thread(ParStart);
                    //是否背景线程根据自己需要加,加上后理论上不影响界面的操作,就是不卡
                    myThread.IsBackground = true;
                    object o = str_url;   
                    myThread.Start(o);
                    //GetPageSource(toolStripTextBox1.Text.ToString().Trim());
                }
            }        private void GetPageSource(object url)
            {
                Uri uri = new Uri(url.ToString());
                HttpWebRequest hwReq = (HttpWebRequest)WebRequest.Create(uri);
                HttpWebResponse hwRes = (HttpWebResponse)hwReq.GetResponse();            hwReq.Method = "Get";            hwReq.KeepAlive = false;            //从输入的网站提取HTML源码
                StreamReader reader = new StreamReader(hwRes.GetResponseStream(), System.Text.Encoding.GetEncoding("GB2312"));
                settext(reader.ReadToEnd());
            }
            private void settext(string text)
            {
                if (richTextBox1.InvokeRequired == true)
                {
                    SetTextHandler set = new SetTextHandler(settext);
                    richTextBox1.Invoke(set, new object[] { text });
                }
                else
                {
                    richTextBox1.Text = text;
                }         }    
    }
    }
      

  5.   


    //在初始化方法设置以下相关属性.              
                    //对象所允许的最大并发连接数//可在配置文件中设置
                    System.Net.ServicePointManager.DefaultConnectionLimit = 1000;
                    //是否使用 Nagle 不使用 提高效率 
                    System.Net.ServicePointManager.UseNagleAlgorithm = false;
                    //对象的最大空闲时间.(默认为100秒的)
                    System.Net.ServicePointManager.MaxServicePointIdleTime = 3600 * 1000;
    //-------------------------------------------------------------------------------------------
    //在 while循环中的处理..
     while (!worker.CancellationPending)
    {
                    request = WebRequest.Create(userUrl) as HttpWebRequest;
                     request.Headers.Add(HttpRequestHeader.AcceptEncoding, "gzip,deflate");
                    request.Proxy = null;//
                    request.KeepAlive = true;
                    //数据是否缓冲 false 提高效率  
                    request.AllowWriteStreamBuffering = false;                 Stream stream = null;
                    if (response.ContentEncoding.ToLower().Contains("gzip"))
                    {
                        stream = new GZipStream(response.GetResponseStream(), CompressionMode.Decompress);
                    }
                    else if (response.ContentEncoding.ToLower().Contains("deflate"))
                    {
                        stream = new DeflateStream(response.GetResponseStream(), CompressionMode.Decompress);
                    }
                    else
                    {
                        stream = response.GetResponseStream();
                    }
                    using (stream)
                    {
                        using (StreamReader sr = new StreamReader(stream, true))
                        {
                            string resultString = sr.ReadToEnd();
                        }//-------------------------------------------------------------------------------------------//使用完后要进行释放,否则易造成网络堵塞
                    if (request != null)
                    {
                        request.Abort();
                        request = null;
                    }
                    if (response != null)
                    {
                        response.Close();
                        response = null;
                    }
    }//在适当时间进行 强制垃圾回收.
    System.GC.Collect();//-------------------------------------------------------------------------------------------//以上是总结的关于多线程使用 HttpWebRequest 用于提高效率获取网页源代码的 相关设置. (省略了其他代码..)