C# 使用多个读卡器时出现间歇性错误

C# 使用多个读卡器时出现间歇性错误,c#,ado.net,sqldatareader,C#,Ado.net,Sqldatareader,以下是来自 在使用SqlDataReader时,关联的SqlConnection正忙于为SqlDataReader提供服务,并且除了关闭SqlConnection之外,无法对SqlConnection执行其他操作 我有两个不同命令使用的一个开放连接的代码。实际上有两种方法。第二个方法是在while(reader.Read())循环中调用 我收到间歇性的错误,提示–已经有一个与此命令相关联的打开的DataReader,必须先关闭它 但为什么它不总是抛出错误呢 参考资料 既然您知道在同一个

以下是来自

在使用SqlDataReader时,关联的SqlConnection正忙于为SqlDataReader提供服务,并且除了关闭SqlConnection之外,无法对SqlConnection执行其他操作

我有两个不同命令使用的一个开放连接的代码。实际上有两种方法。第二个方法是在
while(reader.Read())
循环中调用

我收到间歇性的错误,提示–
已经有一个与此命令相关联的打开的DataReader,必须先关闭它

但为什么它不总是抛出错误呢

参考资料


  • 既然您知道在同一个连接上嵌套数据读取器是个坏主意,为什么还要这样做?重构代码

    现在回答你的问题,

    网络层在拉模式下不工作。您打开一个连接,发出一些命令,然后开始使用结果。请注意,您不拉动而是消耗。这是有区别的。在代码中,
    while(reader.Read)
    循环不会稳定地提取数据。执行命令时,数据开始到达。它在你的电脑上得到缓冲。缓冲区有一个限制。如果总数据小于缓冲区大小,则数据传输速度非常快。如果总数据大于缓冲区大小,那么当然
    reader.read()
    会为下一批数据腾出空间

    这意味着两个
    数据读取器
    可以使用相同的
    连接
    ,只要第一个数据读取器只获取很少的数据量。因此,当第二个datareader尝试使用该连接时,该连接已处于空闲状态


    两个线程之间存在争用条件。第一个线程收集响应第一个命令发送的数据。第二个线程是运行程序的线程。双方都争先完成比赛。如果收集器线程能够在主线程命中第二个datareader之前下载所有数据,那么事故就避免了。但是,如果数据太大或网络速度太慢,或者很幸运它没有足够的cpu,那么主线程会在连接仍在工作时点击第二个datareader。

    显示这些方法和相关代码。我想这是一种比赛条件。但是为什么使用相同的连接呢?在两种方法中都使用
    using
    -语句。resultrade区域也可以:)@Lijo:不要发布图像,而是发布文本。现在还不清楚
    ResultRead
    是什么意思,如果它是用所有参数显示的方法。您还显示了一个类
    DataAccessLayerBase
    ,该类未在上述代码中使用。我很确定您最好废弃
    DataAccessLayerBase
    -class。是吗?尝试在仍然返回数据的连接上执行命令是在自找麻烦,即使它是允许的。只是不要使用相同的连接。重复打开和关闭连接不需要任何费用-连接池会注意重用以前关闭的连接。实际上,使用池要快得多,因为更少的连接意味着更少的锁定资源。我不知道为什么您认为这里涉及两个线程。@Joe:只有一个线程:程序主线程。还有其他线程,即执行网络活动的框架线程。它们是隐藏的,你只能看到它们的名字和ID。