相关疑难解决方法(0)

从异步方法返回 IAsyncEnumerable

采取以下方法:

public async IAsyncEnumerable<int> Foo()
{
   await SomeAsyncMethod();
   return Bar(); // Throws since you can not return values from iterators
}

public async IAsyncEnumerable<int> Bar()
{
   for(int i = 0; i < 10; i++)
   {
       await Task.Delay(100);
       yield return i;
   }
}
Run Code Online (Sandbox Code Playgroud)

我想知道最好的做法是什么,上面的代码试图做什么。IAsyncEnumerable基本上从方法返回一个async。

对于我自己来说,我可以想象两种方式:

  1. 迭代IAsyncEnumerable并立即返回结果。
await foreach(var item in Bar())
{
    yield return item;
}
Run Code Online (Sandbox Code Playgroud)
  1. 创建一个可以临时存储的结构IAsyncEnumerable,这似乎是更好的解决方案,但仍然有点矫枉过正。
return new AsyncEnumerableHolder<int>(Bar());

public struct AsyncEnumerableHolder<T>
{
    public readonly IAsyncEnumerable<T> Enumerable;

    public AsyncEnumerableHolder(IAsyncEnumerable<T> enumerable)
    {
        Enumerable …
Run Code Online (Sandbox Code Playgroud)

c# async-await c#-8.0 iasyncenumerable

10
推荐指数
1
解决办法
8848
查看次数

如果将IEnumerable与async / await一起使用(从带有Dapper的SQL Server中流式传输数据)一起使用,会发生什么情况?

我正在使用Dapper从SQL Server中的一个非常大的数据集中流式传输数据。返回IEnumerable和调用可以正常工作Query(),但是当我切换到时QueryAsync(),该程序似乎尝试从SQL Server而非流式读取所有数据。

根据这个问题,它应该可以正常工作buffered: false,我正在做,但是这个问题什么也没说async/await。

现在根据这个问题,要完成我想做的事情并不容易QueryAsync()。

我是否正确理解在切换上下文时会枚举可枚举的对象async/await?

另一个问题是,当新的C#8异步流可用时,是否可以做到这一点?

c# sql-server async-await dapper c#-8.0

9
推荐指数
2
解决办法
811
查看次数

标签 统计

async-await ×2

c# ×2

c#-8.0 ×2

dapper ×1

iasyncenumerable ×1

sql-server ×1