Car*_*l R 17 c# ado.net asynchronous
异步读取字段有什么好处吗?
如果我有以下内容:
SqlDataReader reader = await cmd.ExecuteReaderAsync();
while (await reader.ReadAsync())
{
try
{
if (reader.IsDBNull(COL_NAME))
{
continue;
}
user = new User();
user.Id = reader.GetInt32(COL_ID);
Run Code Online (Sandbox Code Playgroud)
通过使用会有任何真实世界的利益IsDBNullAsync和GetInt32Async等?
Mar*_*ell 21
在对反射器进行一些窥视之后,这里有趣的方法(GetFieldValueAsync<T>,IsDBNullAsync和internal方法GetBytesAsync)只为CommandBehavior.SequentialAccess场景做了"有趣的"代码.所以:如果你没有使用它:不要打扰 - 行数据已经缓存在内存中,并且Task<T>是纯粹的开销(尽管它至少会是一个已经完成的任务结果,即Task.FromResult<T>- 由其有效处理await,没有上下文切换).
重复 Marc 所写的内容,其中包含来自官方ADO.NET 文档的片段- 不幸的是,该片段已移至 Microsoft 博客档案:
Read vs ReadAsync – 调用 ReadAsync 也是一个好主意:在非顺序模式下,这将读取所有列数据,这可能会跨越多个数据包,从而可以更快地访问列值。在顺序模式下,ADO.NET 将需要完成读取当前行的数据(如果尚未完全读取),并且某些 TDS 令牌可能位于行之间,然后可以异步读取。
IsDBNull 和 GetFieldValue 对比 IsDBNullAsync 和 GetFieldValueAsync- 如果您之前调用过 ReadAsync 并且使用的是非顺序访问,那么调用这些方法的同步版本将提供最佳性能,因为列数据已经被读取和处理(因此调用异步方法只会增加包装的开销任务中的值)。但是,如果您在非顺序访问模式下调用 Read,或者如果您正在使用顺序访问模式,那么决定要困难得多,因为您需要考虑需要读取多少数据才能到达所需列以及多少数据该列可能包含。如果您已阅读上一列,并且目标列很小(如布尔值、日期时间或数字类型),那么您可能需要考虑使用同步方法。或者,如果目标列很大(如 varbinary(8000))或者您需要读取大列,那么使用异步方法会好得多。最后,如果目标列很大(如 varbinary(MAX)、varchar(MAX)、nvarchar(MAX) 或 XML),那么您应该考虑新的取而代之的是GetStream、GetTextReader或GetXmlReader方法。