嵌套了两个foreach循环,总共大概要循环60000次,到20000多次的时候程序直接结束了,记录异常日子的表中也没有问题,求大神指点下
var categories = ctx.Sync_Categorys; foreach (var cateogry in categories) { var boards = ctx.Sync_Boards.Where(b => b.CategoryID == cateogry.CategoryID); foreach (var board in boards) { string address = string.Format("http://shouji.baidu.com/software/list?cid={0}&boardid={1}&page_num={2}", cateogry.CategoryID, board.BoardID, 1); //根据第一页的信息获取当前子分类的页面数量 var shtml = WebUtils.GetUrlOutput(address, Encoding.UTF8); if (!string.IsNullOrEmpty(shtml)) { HtmlDocument doc = new HtmlDocument(); doc.LoadHtml(shtml); HtmlNode rootnode = doc.DocumentNode; //页面数量的XPath var xpath = @"//*[@id='doc']/div[3]/div[2]"; HtmlNodeCollection items = rootnode.SelectNodes(xpath); if (items != null && items.Count > 0) { //获取到某个分类下的App的页面数量 int pagenum = int.Parse(items[0].OuterHtml.Split('\"')[3].Trim()); for (int i = 1; i <= pagenum; i++) { if (shtml.IndexOf("app-box") > 0) { string addressurl = string.Format("http://shouji.baidu.com/software/list?cid={0}&boardid={1}&page_num={2}", cateogry.CategoryID, board.BoardID, i.ToString()); //每一个页面对应一个addressurl var shtmls = WebUtils.GetUrlOutput(addressurl, Encoding.UTF8); //调用抓取App的方法,循环抓取 SyncAppBase(ctx, shtmls, board.BoardID); } } } } } }
可以参考下C#多线程的章节,学习学习就可以了,这种卡死不是真卡死,是ui卡死,你可以将这部分放到单独的线程中,然后保持同ui的通信就可以了
case 4: Console.WriteLine("服务正在同步APP详情......"); Thread td2 = new Thread(delegate() { SyncBussiness.Instance.GetAllSyncAppDetail(); Console.WriteLine("数据!"); }); Thread t3 = new Thread(delegate() { SyncBussiness.Instance.GetAllSyncAppDetail(); Console.WriteLine("数据!"); }); t3.Start(); td2.Start(); Console.WriteLine("同步App详情成功!"); break;
想让2个线程都做一件事情,但是线程根部不执行,为何啊
是不是内存爆了?
不知道啊
60000 多次也不是很多的样子,你可以开多线程啊。
怎么开啊
呵呵 爬取别人网站内容一定是要异步多线程的啊
你在读取远程页面和分析页面这两步都很慢的
具体该怎么做才好啊
明显的异步,多线程,后台线程等干的事了。想让你的程序响应,耗时的事情后台慢慢做就是了。
大神,具体该怎么弄啊,求指导啊
@混沌战士: 楼下也说了,?Thread,Aysnc backgroudworker,拿这些去搜索一下,代码一大顿。
Thread ,backgroundworker
异步。
异步多线程干吧