SqlDataReader.ReadAsync卡在巨大的blob上

时间:2015-11-10 16:35:18

标签: c# async-await sqldatareader

看一下这段代码:

private async void button1_Click(object sender, EventArgs e)
{
    using (SqlConnection connection = new SqlConnection("some connection string"))
    {
        await connection.OpenAsync();

        using (SqlCommand command = new SqlCommand("select document from myTable where id = 'xyz'", connection))
        {
            using (SqlDataReader reader = await command.ExecuteReaderAsync())
            {

                if (await reader.ReadAsync())

                    if (!await reader.IsDBNullAsync(0))
                    {
                        data = reader.GetStream(0);
                    }
            }

        }

    }

}

Document是我的SQL数据库中的一个图像字段,它可能会变得很大。虽然它可以很好地处理小blob(使用200 kB Blob测试),但它不适用于巨大的blob(目前使用400 MB Blob进行测试)。 当我使用调试器并逐步执行代码时,我看到它进入了等待reader.ReadAsync()的行,我们将永远留在那里。

然而,在以下情况下,它按预期工作:

  • 只需调用reader.Read()(而不是ReadAsync)
  • 或当我使用以下命令调用ExecuteReaderAsync时:CommandBehavior.SequentialAccess

但是为什么它不能在没有丢失任何错误的情况下使用Non-SequentialAccess?

我得到的是Threads-Window上的这个callstack: enter image description here

刚才意识到这个callstack随着时间的推移而变化,所以似乎正在进行中: enter image description here

但是,它并没有结束。

0 个答案:

没有答案