相关疑难解决方法(0)

与巨大的数据流异步

我们使用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处理大数据流的最佳且易于使用的异步替代方法是什么?我想避免在处理时将所有数据存储在内存中.

.net c# task-parallel-library async-await

40
推荐指数
4
解决办法
5158
查看次数

使用async/await与DataReader?(没有中间缓冲区!)

我的目标很简单,我想做异步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)

c# io asynchronous async-await .net-4.5

14
推荐指数
1
解决办法
2万
查看次数

承诺的反转是什么?

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结束之后仍然可以访问域.

language-agnostic haskell scala frp promise

9
推荐指数
1
解决办法
638
查看次数

适当使用ES6生成器和分页

我一直在考虑这个问题,我似乎无法找到一个合理的解决方案来解决这个问题.问题陈述很简单 - 编写一个懒惰地对远程数据集进行分页的生成器.为简化起见,理想情况下,我希望我的库用户可以看到:

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

javascript pagination ecmascript-6 es6-promise

6
推荐指数
1
解决办法
1317
查看次数