• ADO.NET 4.5中的异步与流特性


    .NET 4.5为仍在选择直接与DataReader系列类打交道的.NET开发人员带来了一些新的异步与流特性支持。SqlDataReader允许开发人员在减少一些便利性的基础上获得更好的性能。例如,该类不管需要从服务器等待多少个数据包,通常都会一次性读取整行。如果有多个大型对象列,SqlDataReader会将它们一次性存储进内存中。如果你切换至顺序访问,那么将不再需要缓存整行,不过必须按照顺序对列进行读取。

    借助.NET 4.5中的顺序访问,开发人员可以有选择地使用NextResultAsync、ReadAsync、IsDBNullAsync与GetFieldValueAsync进一步地调整性能。需要澄清一点的是,ADO.NET的异步方法不会自动提升性能,并且对于单线程提速可能毫无作用。不过,它们可以提升处理大量并发请求时的性能,因为它们减少了线程阻塞。底层你需要做的是构建Task对象,要注意这会对垃圾收集器造成压力。一般来说,我们建议:

    1. 尽可能地使用NextResultAsync异步处理数据包;
    2. 在两个模式下都优先选择ReadAsync以使大量数据包再次被异步处理;
    3. 不要在顺序模式下使用IsDBNullAsync与GetFieldValueAsync。列在该模式下已经被缓存,因此创建Task对象没什么作用。

    对于顺序模式,决定是否使用GetFieldValueAsync 稍微有些复杂,Daniel Paoliello解释说:

    不管怎样,如果你在非线性访问模式调用Read,或者如果你正在使用线性访问模式,那么决定将会非常困难,因为你需要考虑从目标列读取多少数据以及该列包含多少数据。如果你已经读完了前一列,并且目标列较小(如Boolean、DateTime或数字类型),那么你也许可以考虑使用一个同步方法。相反,如果目标列较大(如varbinary(8000))或者你需要读取以前的数据较多的类,那么使用一个异步方法可能会更好。最后,如果目标列数据非常大(如varbinary(MAX)、varchar(MAX)、nvrchar(MAX)或XML),那么你应当取而代之考虑新的GetStreamGetTextReaderGetXmlReader方法。

    当与存储在数据库中的大文件打交道时,使用基于流的方法会有一些好处。例如,你可以将流转换至WCF或ASP.NET响应,而不用一次向将整个文件读进内存。这对于.NET开发人员尤为重要,因为大对象堆对于存储碎片非常敏感。

    查看英文原文In Case You Missed It: Async and Streaming for ADO.NET 4.5

    Refer:http://www.infoq.com/cn/news/2012/06/ADO-Async

  • 相关阅读:
    VMWare 桥接模式
    什么是交叉编译,为什么要使用交叉编译
    最常用的四种大数据分析方法
    C#的Dispose模式复习
    Oracle Data Provider for .NET Support for Microsoft .NET Core
    微软发布了量子计算开发包
    关于Oracle分区表的理解
    html 中video标签视频不自动播放的问题
    input 修改placeholder颜色
    正则表达式 手机号验证、邮箱验证、6~16位数字加字母组合、身份证号码验证
  • 原文地址:https://www.cnblogs.com/Irving/p/4364753.html
Copyright © 2020-2023  润新知