for(int i=0;i<listView1.Items.Count;i++)
{
string url = this.listView1.Items[i].SubItems[2].Text.Trim();//取出存在listview1里面的URL地址。
//接下来要获取每个URL对应的源代码,保存到数据库。(URL个数超过100)
}
请问使用多线程怎么样来实现,(现在的速度实在是不行阿,救救我吧,大虾们)
{
string url = this.listView1.Items[i].SubItems[2].Text.Trim();//取出存在listview1里面的URL地址。
//接下来要获取每个URL对应的源代码,保存到数据库。(URL个数超过100)
}
请问使用多线程怎么样来实现,(现在的速度实在是不行阿,救救我吧,大虾们)
解决方案 »
- WinForm打印问题
- 用C#写的一个UDP的Socket程序,传送多个图片数据,正常显示了几个图片后就报错:一个在数据报套接字上发送的消息大于内部消息缓冲器或其他一些网络限制,或该用户用于接收数据报的缓冲器比数据报小。
- 高手救命啊,我的treeview控件装好之好,加载到工具箱,变成灰色的,不能拖动,怎么办?
- .NET 设计器出错了,Hellp!
- 关于在webform中嵌入winform的。给点建议。
- 关于项目引用的问题,疑惑,求解释。。。
- 简单问题求助(菜鸟)
- 怎样把一个长度为1的string类型转成char?
- datagrid的问题。急急急!望兄弟伙帮忙
- 以C#中如何调用frontpage的一些功能。
- 如何更新进度条进度?
- 一个类继承自身有什么意义?
for (int i = 0; i < 10; i++) {
Console.WriteLine("ThreadProc: {0}", i);
// Yield the rest of the time slice.
Thread.Sleep(0);
}
}//可以把下面写在你想什么时候运行读数据库的地方
Thread t = new Thread(new ThreadStart(ThreadProc)); //创建线程
t.Start(); //线程启动
这样也不需要多线程。
即以空间换时间。
for(int a=0;a<listView2.Items.Count;a++)
{
int _ThreadNum1 = listView2.Items.Count; Thread[] mythread1 = new Thread [ _ThreadNum1 ] ; threadadd hostping1 = new threadadd(); hostping1.url = this.listView2.Items[a].SubItems[2].Text.Trim();//添加数据库 hostping1.sd1 = this.listView2.Items[a].SubItems[1].Text.Trim();//添加数据库 hostping1.sd2 = this.listView2.Items[a].SubItems[0].Text.Trim();();//添加数据库 hostping1.sd3 = DateTime.Now.ToString();();//添加数据库
hostping1.sd4 = Int16.Parse(this.listView2.Items[a].SubItems[3].Text.Trim());();//添加数据库
hostping1.getcode = new GetThreadHTMLlist(GetThreadHTML);
mythread1[a] = new Thread (new ThreadStart (hostping1.threadStart)) ;
//初始化一个线程实例
mythread1[a].Start() ;
mythread1[a].Join();
}
你说的瓶颈是什么意思阿?下面是我使用的获取网页源代码的-
private string GetHTML(string url)
{
System.Net.WebClient client = new System.Net.WebClient();
try
{
byte[] buf = client.DownloadData(url);
return System.Text.Encoding.Default.GetString(buf);
}
catch( Exception er)
{
MessageBox.Show(er.ToString());
}
}
呵呵!本来我是想是不是一个目标开一个线程,速度会更快。你觉得我该怎么样来做??
没有什么效果的。
你得用HttpWebRequest,设置最大链接数大一点,然后亲自保存Response。HttpWebRequest hr = (HttpWebRequest)WebRequest.Create(myQuery.Url);
hr.Method = "GET";
hr.ServicePoint.ConnectionLimit = 100; //这里就是最大链接数
HttpWebResponse response = (HttpWebResponse)hr.GetResponse();using (StreamReader sr = new StreamReader(response.GetResponseStream()))
{
using (StreamWriter sw = new StreamWriter(fileName, false))
{
sw.Write(sr.ReadToEnd());
}
}
你得用HttpWebRequest,设置最大链接数大一点,然后亲自保存Response。HttpWebRequest hr = (HttpWebRequest)WebRequest.Create(myQuery.Url);
hr.Method = "GET";
hr.ServicePoint.ConnectionLimit = 100; //这里就是最大链接数
HttpWebResponse response = (HttpWebResponse)hr.GetResponse();using (StreamReader sr = new StreamReader(response.GetResponseStream()))
{
using (StreamWriter sw = new StreamWriter(fileName, false))
{
sw.Write(sr.ReadToEnd());
}
}
------------------------------------
高,实在是高!
呵呵!谢谢关注!
应该不是我没有表达清楚吧?
{
int _ThreadNum1 = listView2.Items.Count;
Thread[] mythread1 = new Thread [ _ThreadNum1 ] ;
threadadd hostping1 = new threadadd();
hostping1.getcode = new GetThreadHTMLlist(GetThreadHTML);
mythread1[a] = new Thread (new ThreadStart (hostping1.threadStart)) ;
//初始化一个线程实例
mythread1[a].Start() ;
mythread1[a].Join();
}
我是这样来建立线程,,你觉得我这样行不行??
to-----charles_y(每天上网一小时
你这样不是一个线程执行完才能执行下一个线程?这跟一个线程有什么两样?
用多个线程的目的,就是为了同时执行,多个线程同时各自去取自己的url的内容(这是瓶颈),这样才能提高效率。
--------------------------------
你代码改了?把改过的贴出来看看你原来那个代码当然不行了,这个mythread1[a].Join();往这儿一放,你这个多线程跟没有现成有什么区别?
{
int _ThreadNum = threadCount;
Thread[] mythread = new Thread [ _ThreadNum ] ;
hostping.getcode = new GetThreadHTMLlist(GetThreadHTML);
mythread[i] = new Thread (new ThreadStart (hostping.threadStart)) ;
//初始化一个线程实例
mythread[i].Start() ;
}
2 (HttpWebResponse)hr.GetResponse(); 如果你是在.net2.0的话,我不建议你用这个方法,这是个同步方法,CPU利用率不高.
3 使用多线程,你自己来控制线程的话,有很大一部分消耗在线程的创建和销毁上了,应该用线程池来操作线程,
4 效率高的解决办法是使用异步操作,调用HttpWebRequest.BeginGetResponse()来进行异步调用.
独取流也应该使用异步方法.问题的关键在于CPU利用率和带宽利用率怎么能达到一个平衡.如果CPU很高而带宽比较小,那怎么做性能都差不多了.
谢谢,指导,但是本人是菜鸟,能不能给出具体的代码或者例子?谢谢!
谢谢了!