【发布时间】:2013-09-24 01:57:09
【问题描述】:
尝试将现有数据访问代码转换为异步并遇到 Rx,因为您无法在方法主体中返回带有 yield return 的 Task<IEnumerable<T>>。
我写了这个,但不确定它是异步的,所以感激地收到了指针
public class EmployeeRepository : IEmployeeRepository
{
public IAsyncEnumerable<Employee> GetEmployees()
{
return Enumerable().ToAsyncEnumerable();
}
private IEnumerable<Employee> Enumerable()
{
using (var connection = new SqlConnection(ConfigurationManager.ConnectionStrings["DBConnString"].ConnectionString))
{
connection.Open();
using (var command = new SqlCommand(@"SELECT * FROM EMPLOYEES", connection))
{
using (var reader = command.ExecuteReader())
{
while (reader.Read())
{
yield return
new Employee()
{
Id = ReadField<int>(reader, "Id"),
Name = ReadField<string>(reader, "Name")
};
}
}
}
}
}
private static T ReadField<T>(IDataRecord reader, string fieldName)
{
var value = reader[fieldName];
return value == DBNull.Value ? default(T) : (T)value;
}
}
【问题讨论】:
-
什么意思,“你不能返回
Task<IEnumerable<T>>?当然可以。你的意思是你当前的接口没有在它的方法签名中使用它吗?将代码转换为异步是通常是一项重大更改,而且非常重要;您将不得不更改许多接口和方法签名。您甚至应该更改名称,因为习惯上在异步方法的末尾包含后缀Async。 -
反应式框架与这个问题有什么关系?
-
你不能用
yield return返回Task<IEnumerable<T>> -
@Enigmativity 我正在尝试找到一种方法来实现收益回报,我认为 Rx 可以给我。
-
@Jon -
yield return仅适用于IEnumerable<>,不适用于IObservable<>。如果您使用yield return,它仍然是同步的。如果你走 Rx 路线,虽然你可以轻松让它异步,但不是yield return然后。
标签: c# .net asynchronous system.reactive