C# 从SqlDataReader异步读取每个字段有什么好处吗?

C# 从SqlDataReader异步读取每个字段有什么好处吗?,c#,asynchronous,ado.net,C#,Asynchronous,Ado.net,异步读取字段有什么好处吗 如果我有以下情况,请说明: SqlDataReader reader = await cmd.ExecuteReaderAsync(); while (await reader.ReadAsync()) { try { if (reader.IsDBNull(COL_NAME)) { continue; } user = new User(); us

异步读取字段有什么好处吗

如果我有以下情况,请说明:

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);

使用
IsDBNullAsync
GetInt32Async
等会有任何实际好处吗?

在查看反射器之后,这里有趣的方法(
GetFieldValueAsync
IsDBNullAsync
,以及
内部
方法
getbyteasync
)只会“有趣”
CommandBehavior.SequentialAccess
场景的代码。因此:如果您不使用它:不用麻烦-行数据已经在内存中缓冲,而且
任务
是纯开销(尽管它至少是一个已经完成的任务结果,即
任务.FromResult
,由
等待
有效处理,没有上下文切换)。

重复Marc写的内容,有一段来自官方的片段-不幸的是,该片段已被移至Microsoft博客存档:

Read vs ReadAsync–调用ReadAsync也是一个好主意:在非顺序模式下,这将读取所有列数据,可能会跨越多个数据包,允许更快地访问列值。在顺序模式下,ADO.NET将需要完成当前行的数据读取(如果尚未完全读取),并且一些TDS令牌可能位于行之间,然后可以异步读取

IsDBNull和GetFieldValue vs IsDBNullAsync和GetFieldValueAsync-如果您以前调用过ReadAsync并且正在使用非顺序访问,那么调用这些方法的同步版本将提供最佳性能,因为列数据已经被读取和处理(因此,调用异步方法只会增加在任务中包装值的开销)但是,如果你调用读非顺序访问模式,或者如果你使用的是顺序访问模式,那么当你需要考虑你需要读取多少数据才能到达你想要的列和该列可以包含多少数据时,这个决定就更难了。如果你读过前一列,并且目标列很小。(像布尔值、日期时间或数值类型),那么您可能需要考虑使用同步方法。或者,如果目标列很大(像VARBIONEX(8000)),或者需要读取大的列,那么使用异步方法要好得多。最后,如果目标列是大的(像VARBION(MAX),VARCHAR(MAX))NVARCHAR(MAX)或XML,那么您应该考虑新的方法或方法。< /P>
我从来没有想过要这样做,但在我看来,这显然是一个否定。既然你已经读取了数据,那么只需将其从内存中取出即可。@DanielGimenez我也是这么想的。我想知道它们为什么会在那里。@DanielGimenez数据并不总是在内存中;在
顺序访问
中,情况显然不是这样的我想谢谢@MarcGravel