当在多个线程内使用时,HttpWebResponse会混淆

时间:2010-06-15 13:15:19

标签: c# multithreading httpwebrequest

在我的应用程序中,我有几个线程将从Web服务获取数据。基本上我只是打开一个URL并获得XML输出。我有几个线程连续执行此操作但具有不同的URL。有时候结果会混淆不清。 XML输出不属于线程的URL,而属于另一个线程的URL。

在每个线程中,我创建了类GetWebPage的实例,并从此实例调用方法Get。该方法非常简单,主要基于MSDN文档中的代码。 (见下文。我在这里删除了错误处理!)

    public string Get(string userAgent, string url, string user, string pass, int timeout, int readwriteTimeout, WebHeaderCollection whc)
    {
        string buffer = string.Empty;
        HttpWebRequest myWebRequest = (HttpWebRequest)WebRequest.Create(url);

        if (!string.IsNullOrEmpty(userAgent))
            myWebRequest.UserAgent = userAgent;

        myWebRequest.Timeout = timeout;
        myWebRequest.ReadWriteTimeout = readwriteTimeout;

        myWebRequest.Credentials = new NetworkCredential(user, pass);
        string[] headers = whc.AllKeys;

        foreach (string s in headers)
        {
            myWebRequest.Headers.Add(s, whc.Get(s));
        }

        using (HttpWebResponse myWebResponse = (HttpWebResponse)myWebRequest.GetResponse())
        {
            using (Stream ReceiveStream = myWebResponse.GetResponseStream())
            {
                Encoding encode = Encoding.GetEncoding("utf-8");
                StreamReader readStream = new StreamReader(ReceiveStream, encode);
                // Read 1024 characters at a time.
                Char[] read = new Char[1024];

                int count = readStream.Read(read, 0, 1024);

                int break_counter = 0;
                while (count > 0 && break_counter < 10000)
                {
                    String str = new String(read, 0, count);
                    buffer += str;
                    count = readStream.Read(read, 0, 1024);
                    break_counter++;
                }
            }
        }
        return buffer;

如您所见,我没有公共属性或任何其他共享资源。至少我没有看到任何。 url 是我在互联网上调用的服务,缓冲区是来自服务器的XML输出。 就像我说的,我在几个线程(10到12)中有多个这个类/方法的实例,有时缓冲区不属于同一个线程的 url 而另一个线。

修改

我添加了

System.Net.ServicePointManager.DefaultConnectionLimit = 25;

现在它的程序在没有错误的情况下工作了很长时间。

1 个答案:

答案 0 :(得分:0)

您的方法完全是线程安全的。

调用方法的代码可能有问题。