在我的应用程序中,我有几个线程将从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;
现在它的程序在没有错误的情况下工作了很长时间。
答案 0 :(得分:0)
您的方法完全是线程安全的。
调用方法的代码可能有问题。