webform页面,实现的是一个图片搜索功能。
点击搜索按钮后,通过对div.innerhtml赋值,将搜索到的图片展现在页面上指定的
DIV中,目前的问题是,图片有很多,一次性搜索完毕后再进行加载的话就太慢了,
可以实现边搜索边加载么?
protected void ButtonSearch_Click(object sender, EventArgs e) { string currentURL = Request.Form["TextBoxURL"]; if (string.IsNullOrEmpty(currentURL)) return; List<string> urlList = new List<string>(FormHelper.GetUrlListByUrl(currentURL).Split('\n')); urlList.Add(currentURL); Task task = new Task(() => { foreach (string url in urlList) { Imgs.InnerHtml += FormHelper.GetHtmlByUrl(url); } }); task.Start(); }
这样为何不行?
瀑布流 的思路也是分页。
提供一思路
搜索的时候不知道 FormHelper.GetUrlListByUrl(currentURL)这个是自己数据库搜索吗还是第3方 能指定张数吗?(可以我在回答)
代码还有一个问题 Imgs.InnerHtml += FormHelper.GetHtmlByUrl(url);
先拼接好在一次行赋值给 Imgs.InnerHtml 。还有new List<string>(FormHelper.GetUrlListByUrl(currentURL).Split('\n'));为什么不用任务呢 并行 不想写线程 就用 Parallel
1. FormHelper.GetUrlListByUrl(currentURL)
这个是自己写的方法,不是数据库搜索,没指定张数
public static string GetUrlListByUrl(string url) { StringBuilder sb = new StringBuilder(); //抓取网页 WebRequest request = WebRequest.Create(url); WebResponse response = request.GetResponse(); //读取文件流 StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.GetEncoding("utf-8")); //reader.ReadToEnd() 表示取得网页的源码 //FileStream fs = new FileStream("~/baidu.html", FileMode.OpenOrCreate); string strhtml = reader.ReadToEnd(); string rxg = '"' + "http.*?" + '"'; MatchCollection mc = Regex.Matches(strhtml, rxg); for (int i = 0; i < mc.Count; i++) { sb.AppendLine(mc[i].ToString().Trim('"')); } return sb.ToString(); }
2. 也可以一次性赋值给Imgs.InnerHtml,但如果内容太多的话,那等待时间不就太长了吗
3. GetUrlListByUrl这边不耗时,主要是下面这个耗时,所以用了多线程
Task task = new Task(() => { foreach (string url in urlList) { Imgs.InnerHtml += FormHelper.GetHtmlByUrl(url); UpdatePanel1.Update(); } }); task.Start();
边搜索边加载?不理解这需求。。。搜索结果分页,图片可以采用延迟加载。。。
就是后台搜索用的是多线程,搜索图片是在一直进行的,想要实现的效果就是,
搜索出一些图片就开始显示在页面上,然后图片不断增加,直到搜索完成
瀑布流或者webform自带的javascript局部刷新工具
这是个伪命题;你这服务器的生成的ajax结果DIV,里面仅仅是一个比如Image的link,这些link浏览器原本就是线程池去解决的,快慢只取决于image的source服务器。但比如你想让浏览器不这么干,那么需要对source进行控制——因此客户端只需要控制dom。再假设你的这些image本身是js code控制的,那么只需要修改这个控制即可。
as ............