gpt4 book ai didi

c# - 异步从数据读取器返回数据

转载 作者:行者123 更新时间:2023-11-30 16:06:44 24 4
gpt4 key购买 nike

我是异步的新手,在尝试让它工作时遇到了很多问题:

我正在尝试从 SQL 加载大型结果集,我希望在运行以下代码时发生:

public async override IEnumerable<DataResult> Read()
{
using (SqlConnection objConn = new SqlConnection(Options.GetConnectionString()))
{
await objConn.OpenAsync();
SqlCommand comm = new SqlCommand(Options.SqlText, objConn);
SqlDataReader reader = await comm.ExecuteReaderAsync();

while (await reader.ReadAsync())
yield return new DataResult { Reader = reader };
}
}

生产者代码:

BlockingCollection<DataResult> DataCollection = new BlockingCollection<DataResult>();

var producer = new Producer<DataResult>(() =>
{
using (var sequenceEnum = sourceEngine.Read().GetEnumerator())
{
while (sequenceEnum.MoveNext())
return sequenceEnum.Current;
}
return null;
}, DataCollection);
producer.Start();

当它逐条记录地读取数据时,它将数据返回给生产者,生产者会将这些数据存储到 BlockingCollection 中,供消费者使用。

我怎样才能让这段代码按照我期望的方式工作?

最佳答案

您的Read 签名不是异步的:

public override IEnumerable<DataResult> Read();

此方法的任何实现都必须是同步的。因此,您可以仅使用 yield 而完全不使用 async/await 来实现它。

如果你希望它是异步的,把Read改成ReadAsync:

public override Task<IEnumerable<DataResult>> ReadAsync();

您可以通过(异步)读入列表然后返回该列表来实现。

但是,如果您真正想要的是一个异步序列(处理每条数据),那么您应该使用 Rx:

public override IObservable<DataResult> Read();

关于c# - 异步从数据读取器返回数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31819411/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com