急。。。多线程,同时获取多个网页内容,300分!

avonqin 2009-03-19 01:09:52

public string ReadUrlContent(string rUrl)
{

// used to build entire input
StringBuilder sb = new StringBuilder();
// 请求该页面
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(rUrl);
// 获取返回的数据(通过相应)
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
//将读取到的数据放入到流里面
Encoding enc = Encoding.GetEncoding("GB2312");
//如果是乱码就改成 utf-8 / GB2312
StreamReader loResponseStream = new StreamReader(response.GetResponseStream(), enc);
sb.Append(loResponseStream.ReadToEnd());
loResponseStream.Close();
return sb.ToString();
}

这是获取一个Url的内容。

如果我们通过for循环5个Url的话,当然也能够最终获取到5个Url的内容。

但是这样是不是效率低了点?我要同时开5个进程,同时获取5个Url的内容。

关键代码是什么呢?请各位指教!

谢谢!
...全文
159 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
avonqin 2009-03-19
  • 打赏
  • 举报
回复
CutBug,

我对您的敬仰犹如滔滔江水绵绵不绝~~

300分奉上,衷心感谢您的帮忙!!
lxf2000104 2009-03-19
  • 打赏
  • 举报
回复
7楼正解
fanjingyxl 2009-03-19
  • 打赏
  • 举报
回复
每个url用一个线程不就可以了
cibei111 2009-03-19
  • 打赏
  • 举报
回复
楼上正解
CutBug 2009-03-19
  • 打赏
  • 举报
回复
页面文件
<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" runat="server">
<title>无标题页</title>
</head>
<body>
<form id="form1" runat="server">
<asp:TextBox ID="TextBox1" runat="server" TextMode="multiLine" Rows="20" Columns="50"></asp:TextBox>
<asp:TextBox ID="TextBox2" runat="server" TextMode="multiLine" Rows="20" Columns="50"></asp:TextBox>
<asp:TextBox ID="TextBox3" runat="server" TextMode="multiLine" Rows="20" Columns="50"></asp:TextBox>
</form>
</body>
</html>


后台
protected void Page_Load(object sender, EventArgs e)
{
Thread[] threads = new Thread[3];

string[] urls = { "http://nba.sports.sina.com.cn/star/Shane-Battier.shtml",
"http://nba.sports.sina.com.cn/star/Yao-Ming.shtml",
"http://nba.sports.sina.com.cn/star/Ron-Artest.shtml"
};

string keyHead = "HttpWebRequest.WebGet";
for (int i = 0; i < threads.Length; i++)
{
threads[i] = new Thread(new ThreadStart(
new WebGet(urls[i], HttpContext.Current, keyHead + i).ReadUrlContent));
threads[i].Start();
Thread.Sleep(100);
}

//等待所有进程结束
foreach (Thread thread in threads)
thread.Join();

for (int i = 0; i < threads.Length; i++)
{
string httpKey = keyHead + i;
if (HttpContext.Current.Items.Contains(httpKey))
{
if (HttpContext.Current.Items[httpKey] != null)
{
TextBox textbox = FindControl("TextBox" + (i + 1)) as TextBox;
textbox.Text = HttpContext.Current.Items[keyHead + i].ToString();
}
}
}
}

class WebGet
{
private string rUrl;
private HttpContext rContext;
private string rKey;
private readonly object obj=new object();
public WebGet(string Url, HttpContext context,string Key)
{
rUrl = Url;
rContext = context;
rKey = Key;
}
public void ReadUrlContent()
{
try
{
// used to build entire input
StringBuilder sb = new StringBuilder();
// 请求该页面
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(rUrl);
// 获取返回的数据(通过相应)
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
//将读取到的数据放入到流里面
Encoding enc = Encoding.GetEncoding("GB2312");
//如果是乱码就改成 utf-8 / GB2312
StreamReader loResponseStream = new StreamReader(response.GetResponseStream(), enc);
sb.Append(loResponseStream.ReadToEnd());
loResponseStream.Close();
response.Close();
rContext.Items[rKey] = sb.ToString();
}
catch
{

}

}
}
avonqin 2009-03-19
  • 打赏
  • 举报
回复
因为我对多线程的应用还没入门,所以请不要贴个连接就好了。不过还是多谢大家的关注!

其实我搜了1天,所以你们贴出来的连接我多少都看过类似的了。

我想,懂多线程的朋友,如果按照本贴的要求写个多线程的建立和调用的话,会很快就能写好的。

把关键代码和思路贴出来就可以了,不用很严密。。。

渴望好心人出现。。。。

femg93 2009-03-19
  • 打赏
  • 举报
回复
我们只用过单个取的,没用过多线程的。不过你到网上搜搜相关的例子,再调试调试,应该就行了。
phoebuswei 2009-03-19
  • 打赏
  • 举报
回复
http://msdn.microsoft.com/zh-cn/library/system.threading(VS.80).aspx
无爱大叔 2009-03-19
  • 打赏
  • 举报
回复
强烈关注、1111

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧