最近我偶然发现了AsreyEnumerator类表格Jeffrey Richter的Power Threading Library,它似乎解决了我在编写异步内容时经常遇到的几个问题.
这个类的想法已经存在了很长一段时间了,我想知道当前版本的.NET/C#现在是否内置了对这种机制的支持,或者是否仍然需要依赖第三方库?或者也许新版本的.NET有一些替代方法可以像Richter的AsyncEnumerator那样简化异步编程?
或者换句话说:今天有没有理由不开始使用Richter的AsyncEnumerator?
编辑:
一些链接与AsyncEnumerator的信息:
Jef*_*ter 18
是的,您仍然可以从我的AsyncEnumerator中受益..NET 4(Tasks,Parallel,PLINQ等)中引入的新线程内容都是关于并发性的.也就是说,它们都是关于计算工作量,将其分解并将其产生到多个线程上,以便工作负载可以在比1个线程完成整个工作负载所需的时间更短的时间内完成.您可以使用这些构造同时执行多个同步I/O操作.但是,同步I/O操作会导致所有线程被阻塞,从而导致线程池创建更多线程.因此,当您的CPU使用率仍然很低时,您的应用程序的资源使用量会急剧上升.这对于实现您的应用程序来说非常低效,并且会阻止您的应用扩展.
我的AsyncEnumerator就是在不阻塞任何线程的情况下启动异步I/O操作,这样您的应用程序的资源使用率仍然非常低,因此您的应用程序可以很好地扩展.在这种情况下CPU使用率仍然很低,因为您正在执行I/O; 不是计算工作量.
在.NET的下一个版本中,新的async/await语言功能(我与Microsoft合作)使您能够执行异步I/O,事实上,新功能的建模与我的AsyncEnumerator非常相似.这么多,您可以将使用我的AsyncEnumerator的代码移植到新模型,只需很少的源代码更改.
正如其他人所指出的,我的AsyncEnumerator仍然提供其他功能,并且可以与.NET 2.0及更高版本一起使用.因此,许多人在很长一段时间内仍然会发现它非常有用.
这里显而易见的是PLINQ,但里希特本人对此表示不满:
Jeffrey Richter 2008年12月4日下午2:27quotereply他们非常不同.Parallel.For特别是关于执行一系列计算绑定操作,并行扩展到机器中的所有CPU.我的AsyncEnumerator主要是发出一个或多个并发I/O绑定操作,而没有任何线程阻止它们完成.
但是,C#asyncCTP在这里可能很有用,使得线程延续更加合理,即
var bytesRead = await stream.ReadAsync(...);
Console.WriteLine(bytesRead); // woah! we're on a different thread now!
Run Code Online (Sandbox Code Playgroud)
在这里,C#编译器重写所有内容await,使其成为现有异步操作(必须返回"等待"值)的回调/继续.一旦这个生产,我希望这将成为一种更自然的方式来编写由于异步导致内在延迟的代码.
| 归档时间: |
|
| 查看次数: |
4059 次 |
| 最近记录: |