zoukankan      html  css  js  c++  java
  • 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开发人员尤为重要,因为大对象堆对于存储碎片非常敏感。

  • 相关阅读:
    opencv 在工业中的应用:模板匹配
    opencv 在工业中的应用:圆孔定位
    视觉基础与开发思路-第十节其他功能简介及总结
    视觉基础与开发思路-第九节形态学操作
    视觉基础与开发思路--第八节图像分割之轮廓进一步处理
    视觉基础与开发思路-第七节图像分割之点线圆边缘
    视觉基础与开发思路--第六节区域特征提取
    视觉基础与开发思路--第五节阈值分割
    vmware key
    编程常用命名大全
  • 原文地址:https://www.cnblogs.com/shihao/p/2533858.html
Copyright © 2011-2022 走看看