关于多线程编程和PLINQ的实例

以专业开发人员为伍 2013-04-10 03:02:00
加精
好久没有发帖了。

我写了大量多线程程序,采用过各种手段来同步线程操作结果。实际上当不太要求非常高性能时,我们可以使用 PLINQ。因为它足够简单!

我举一个例子,假设我要访问csdn的.net论坛的首页列表,找出所有首页上的帖子中、有sp1234回帖(或者发帖)的,那么顺序依次查找每一个帖子,和并发查找帖子相比,慢多少呢?

大家可以自己做一个测试(使用 System.Diagnostics.Stopwatch)。我这里只是把测试代码写出来:

首先需要下载 Html Agility Pack,因为这里使用它分析 html 页面。在引用了它的dll并且在代码中using了它的命名空间之后,测试代码如下
var titles = from row in GetHtml("http://bbs.csdn.net/forums/DotNET/").DocumentNode.SelectSingleNode("//table[@class='table_list parent_forum ']").Elements("tr").Skip(1)
let td = row.Element("td")
where td != null
let a = td.Descendants("a").FirstOrDefault()
where a != null
select new
{
href = a.Attributes["href"].Value,
text = a.InnerText
};
var pages = from t in titles.AsParallel().WithDegreeOfParallelism(64)
where t.href != null
let path = "http://bbs.csdn.net" + t.href
let subQuery = from nick in GetHtml(path).DocumentNode.SelectNodes("//span[@class='name2nick']")
where nick.InnerText == "sp1234"
select nick
where subQuery.Any()
select new
{
title = t.text,
href = path
};
var results = pages.ToList();


当你将
from t in titles.AsParallel().WithDegreeOfParallelism(64)
改为简单的
from t in titles
时,可以测试一下顺序执行需要多少时间。

我对c# 4.5的 Async 和Await 相当有意见,我认为它把非常简单和琐碎的事情给“搞砸了”,它使得许多程序员忘记了多线程编程的基本概念,因此应该尽量避免使用这两个让人“傻瓜化”的关键字。但是我对 PLINQ 如此强大和简单却非常敬佩,因为它不是针对简单和琐碎的事情,而是直接改变了非常复杂的编程工作,只有这个场景下才体现出“傻瓜化”的真正好处。
...全文
14615 80 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
80 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_32102067 2015-10-19
  • 打赏
  • 举报
回复
看来还需努力啊,,都不懂
fcqm8888 2015-08-23
  • 打赏
  • 举报
回复
这个实例说明什么问题呢?应该交代一下。
paopao_426 2015-08-21
  • 打赏
  • 举报
回复
async await 同感!
kusirp21 2015-01-24
  • 打赏
  • 举报
回复
P哥确实牛B啊。TPL有自己的应用场景和适用范围,如果只能看其中一个地方使用TPL方便就是否可以认为丢掉其他呢?json比xml更轻,那么xml就这无用处?linq比entity fromework有时来得更快,是不是entity fromework一无是处?TPL只是并行而已,它调用的是系统内的线程池实现并发,await是为了实现同步,两者密切相关,但却是完全两个不同的概念,丢掉await会使用TPL部分场景下不适用,更别提其他的了。
tossgoon 2014-12-29
  • 打赏
  • 举报
回复
不好意思,刚才看错了,google没下载到 Html Agility Pack,从别的网下下载了。HtmlDocument是一开始认为是.Net的类。这下好了。
tossgoon 2014-12-29
  • 打赏
  • 举报
回复
var doc = new HtmlDocument(); 这句话也出错啊,好像htmlDocument不能直接实例化吧?如何解决? 还有 doc.Load(new StringReader(content));确实也没有这个方法啊。
  • 打赏
  • 举报
回复
HtmlAgilityPack 用的这个么 百度了下 呵呵 学习学习先 都比一个
  • 打赏
  • 举报
回复
http://msdn.microsoft.com/zh-cn/library/system.windows.forms.htmldocument.aspx这里找的
  • 打赏
  • 举报
回复
HtmlDocument.Load是怎么点出来的 你自己扩展的方法么 在msdn都没找到说明
nadongjiao1 2013-10-10
  • 打赏
  • 举报
回复
我来晚了。好东西帮顶
那一年我们21 2013-10-08
  • 打赏
  • 举报
回复
kigsir 2013-07-06
  • 打赏
  • 举报
回复
zxstudys 2013-07-06
  • 打赏
  • 举报
回复
mark 标记回头学习
jy00578880 2013-05-29
  • 打赏
  • 举报
回复
mark 标记回头看
liuyuainil 2013-05-21
  • 打赏
  • 举报
回复
楼主基本一年一发帖,不过一发都是经典帖
  • 打赏
  • 举报
回复
kong xian kan kan
kissman6666 2013-05-15
  • 打赏
  • 举报
回复
楼主,命不久矣!消遣下...
Banianer 2013-05-12
  • 打赏
  • 举报
回复
楼主的文章要支持!
没花鹿 2013-05-10
  • 打赏
  • 举报
回复
抢个分--- sp 的
奈种烟草味 2013-05-08
  • 打赏
  • 举报
回复
看不懂也要顶
加载更多回复(51)

8,494

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 LINQ
社区管理员
  • LINQ
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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