我们使用IEnumerables从数据库中返回大量数据集:
public IEnumerable<Data> Read(...)
{
using(var connection = new SqlConnection(...))
{
// ...
while(reader.Read())
{
// ...
yield return item;
}
}
}
Run Code Online (Sandbox Code Playgroud)
现在我们想使用异步方法来做同样的事情.但是,async没有IEnumerables,因此我们必须将数据收集到列表中,直到加载整个数据集:
public async Task<List<Data>> ReadAsync(...)
{
var result = new List<Data>();
using(var connection = new SqlConnection(...))
{
// ...
while(await reader.ReadAsync().ConfigureAwait(false))
{
// ...
result.Add(item);
}
}
return result;
}
Run Code Online (Sandbox Code Playgroud)
这将消耗服务器上的大量资源,因为所有数据必须在返回之前在列表中.IEnumerables处理大数据流的最佳且易于使用的异步替代方法是什么?我想避免在处理时将所有数据存储在内存中.
我的目标很简单,我想做异步I/O调用(使用异步等待) - 但是:
好.
目前这里是我的代码,它的工作是从db读取并将每一行项目投射到a Func<>
public IEnumerable < T > GetSomeData < T > (string sql, Func < IDataRecord, T > projector)
{
using(SqlConnection _conn = new SqlConnection(@"Data Source=..."))
{
using(SqlCommand _cmd = new SqlCommand(sql, _conn))
{
_conn.Open();
_cmd.CommandTimeout = 100000;
using(IDataReader rdr = _cmd.ExecuteReader())
{
while (rdr.Read()) yield return projector(rdr);
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
那么,投影机是什么?
每个类都有一个函数,它获取a record
(IDataRecord
)并创建一个实体:
示例:
public class MyClass
{
public static MyClass MyClassFactory(IDataRecord …
Run Code Online (Sandbox Code Playgroud) promise表示将来可能可用的值(或未能这样做).
我正在寻找的是一种数据类型,它表示将来可能不可用的可用值(可能是由于错误):
Promise a b = TransitionFromTo<PENDING, Either<value a, error b>>
??? a = TransitionFromTo<value a, Either<ENDED, FAILED>> or
??? a b = TransitionFromTo<value a, Either<ENDED, error b>>
Run Code Online (Sandbox Code Playgroud)
是否已经探索过这样一个概念(或类似概念)?是否存在语义或常用习语?
例如,它可能表示将关闭的开放数据库连接.我的特定用例将在FRP中表示"可变",即可变大小的集合式集合,作为此类"结束值"的流 - 当事件发生时,将值添加到集合中,并且当值"结束时" "它被删除了.
我觉得这代表作为Signal<Option<value>>
或{data = value, ended = Promise<null>}
不完全匹配它-第一种情况不包括保证该值最终稳定到Nothing
与第二有data
结束之后仍然可以访问域.
我一直在考虑这个问题,我似乎无法找到一个合理的解决方案来解决这个问题.问题陈述很简单 - 编写一个懒惰地对远程数据集进行分页的生成器.为简化起见,理想情况下,我希望我的库用户可以看到:
for (var user of users()) {
console.log(user);
}
Run Code Online (Sandbox Code Playgroud)
我似乎无法让发电机工作.我认为像这样的逻辑可行,但我无法弄清楚如何实现它.
function* users() {
while (canPaginate) {
yield* getNextPageOfUsers() // This will need to return an array of users from an http request
}
}
Run Code Online (Sandbox Code Playgroud)
我确定我在想这里有什么问题,但是我似乎找不到任何使用像这样的生成器的人的例子(大多数人使用静态数据或人们做类似的东西async(function*(){...})
不完全是什么我希望这样做.)这里的重要部分是我希望最终用户能够如上所述使用数据.
-Vince
async-await ×2
c# ×2
.net ×1
.net-4.5 ×1
asynchronous ×1
ecmascript-6 ×1
es6-promise ×1
frp ×1
haskell ×1
io ×1
javascript ×1
pagination ×1
promise ×1
scala ×1