标签: iasyncenumerable

IAsyncEnumerable在C#8.0预览中不起作用

我正在玩C#8.0预览,无法开始IAsyncEnumerable工作.

我尝试了以下内容

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

我最终使用了一个名为Nuget的包AsyncEnumerator,但是我收到以下错误:

  1. 错误CS1061' IAsyncEnumerable<int>'不包含' '的定义,GetAwaiter并且没有可访问的扩展方法' GetAwaiter' IAsyncEnumerable<int>可以找到类型' ' 的第一个参数(你是否缺少using指令或汇编引用?)
  2. 错误CS1624' Program.Get()' 的主体不能是迭代器块,因为' IAsyncEnumerable<int>'不是迭代器接口类型

我在这里错过了什么?

c# c#-8.0 iasyncenumerable

8
推荐指数
1
解决办法
5025
查看次数

如何使用 C#8 IAsyncEnumerable&lt;T&gt; 异步枚举并行运行的任务

如果可能,我想为并行启动的任务创建一个异步枚举器。所以第一个完成的是枚举的第一个元素,第二个完成的是枚举的第二个元素,依此类推。

public static async IAsyncEnumerable<T> ParallelEnumerateAsync(this IEnumerable<Task<T>> coldAsyncTasks)
{
    // ... 
}
Run Code Online (Sandbox Code Playgroud)

我打赌有一种使用ContinueWith和 a 的方法Queue<T>,但我并不完全相信自己会实现它。

c# asynchronous task-parallel-library async-await iasyncenumerable

8
推荐指数
2
解决办法
5847
查看次数

IAsyncEnumerable 和数据库查询

我有三个返回IAsyncEnumerable的控制器方法WeatherForecast。第一个 #1 使用SqlConnection读者并产生结果async。第二个#2 使用具有使用扩展能力的 EF Core AsAsyncEnumerable。第三个 #3 使用 EF Core 和ToListAsync方法。

我认为 #1 和 #2 的缺点是,例如,如果我在 while 或 for every 内部执行一些耗时的操作,那么数据库连接将一直打开到最后。在场景 #3 中,我可以使用关闭的连接迭代列表并执行其他操作。

但是,我不知道IAsyncEnumerable对于数据库查询是否有意义。是否存在内存和性能问题?如果我用于IAsyncEnumerable从 API 返回 HTTP 请求,那么一旦返回响应,它就不在内存中,我可以返回下一个响应,依此类推。但是数据库呢?如果我选择所有行(使用IAsyncEnumerableToListAsync),整个表在哪里?

也许这不是 StackOverflow 的问题,我在这里遗漏了一些重要的东西。

#1

[HttpGet("db", Name = "GetWeatherForecastAsyncEnumerableDatabase")]
public async IAsyncEnumerable<WeatherForecast> GetAsyncEnumerableDatabase()
{
    var connectionString = "";
    await using var connection = new SqlConnection(connectionString);

    string sql = "SELECT * FROM [dbo].[Table]";
    await …
Run Code Online (Sandbox Code Playgroud)

c# asp.net .net-core asp.net-core iasyncenumerable

8
推荐指数
1
解决办法
4670
查看次数

如何强制 IAsyncEnumerable 遵守 CancellationToken

编辑:这个问题的要求已经改变。请参阅下面的更新部分。

我有一个异步迭代器方法,它产生一个IAsyncEnumerable<int>(数字流),每 200 毫秒一个数字。此方法的调用者使用流,但希望在 1000 毫秒后停止枚举。因此使用了 a CancellationTokenSource,并且将令牌作为参数传递给WithCancellation扩展方法。但令牌不受尊重。枚举一直持续到所有数字都被消耗完:

static async IAsyncEnumerable<int> GetSequence()
{
    for (int i = 1; i <= 10; i++)
    {
        await Task.Delay(200);
        yield return i;
    }
}

var cts = new CancellationTokenSource(1000);
await foreach (var i in GetSequence().WithCancellation(cts.Token))
{
    Console.WriteLine($"{DateTime.Now:HH:mm:ss.fff} > {i}");
}
Run Code Online (Sandbox Code Playgroud)

输出:

12:55:17.506 > 1
12:55:17.739 > 2
12:55:17.941 > 3
12:55:18.155 > 4
12:55:18.367 > 5
12:55:18.520
: > 572 18 >
18 :55:18.973 > 8 …

c# cancellation c#-8.0 iasyncenumerable

7
推荐指数
1
解决办法
3587
查看次数

使用 IAsyncEnumerable 读取文本文件

我在测试 C# 8.0 功能时遇到了 IAsyncEnumerable。我从 Anthony Chu ( https://anthonychu.ca/post/async-streams-dotnet-core-3-iasyncenumerable/ ) 中找到了非凡的例子。它是异步流和替代Task<IEnumerable<T>>

// Data Access Layer.
public async IAsyncEnumerable<Product> GetAllProducts()
{
    Container container = cosmosClient.GetContainer(DatabaseId, ContainerId);
    var iterator = container.GetItemQueryIterator<Product>("SELECT * FROM c");
    while (iterator.HasMoreResults)
    {
        foreach (var product in await iterator.ReadNextAsync())
        {
            yield return product;
        }
    }
}

// Usage
await foreach (var product in productsRepository.GetAllProducts())
{
    Console.WriteLine(product);
}
Run Code Online (Sandbox Code Playgroud)

我想知道这是否可以应用于读取文本文件,例如下面逐行读取文件的用法。

foreach (var line in File.ReadLines("Filename"))
{
    // ...process line.
}
Run Code Online (Sandbox Code Playgroud)

我真的很想知道如何将 async withIAsyncEnumerable<string>()应用于上述 foreach 循环,以便在阅读时进行流式传输。

如何实现迭代器以便我可以使用 yield …

c# system.io.file c#-8.0 iasyncenumerable

7
推荐指数
1
解决办法
1792
查看次数

在IAsyncEnumerable中使用linq类型方法的正确方法是什么?

.NET Core似乎没有对IAsyncEnumerable附带的任何linq支持。能够执行诸如ToList和Count之类的简单事情的正确方法是什么?

c# iasyncenumerable

7
推荐指数
1
解决办法
76
查看次数

IAsyncEnumerable 中缺少等待运算符时的警告消息

当调用这样的方法而不执行await任务时,我们可以返回以下内容:

public Task<bool> GetBoolAsync()
{
    return Task.FromResult(true);
}
Run Code Online (Sandbox Code Playgroud)

a 相当于什么IAsyncEnumerable<>并避免警告。

async IAsyncEnumerable<bool> GetBoolsAsync() // <- Ugly warning
{
    yield return true;
    yield break;
}
Run Code Online (Sandbox Code Playgroud)

警告 CS1998 此异步方法缺少“await”运算符,并将同步运行。考虑使用“await”运算符等待非阻塞 API 调用,或使用“await Task.Run(...)”在后台线程上执行 CPU 密集型工作。

c# async-await iasyncenumerable

7
推荐指数
1
解决办法
2677
查看次数

IAsyncEnumerable 或 IAsyncEnumerator 的工厂

我想知道是否有一种方法可以创建 Source对象IAsyncEnumerable<T>IAsyncEnumerator<T>通过 Source 对象创建,就像TaskCompletionSource允许人们执行任务一样。特别是,TaskCompletionSource可以像任何其他参数一样传递。

也许是这样的:

public class AsyncEnumerables {

    public Task HandlerTask { get; set; }

    public async Task<string> ParentMethod() {
        var source = new AsyncEnumerableSource<int>();
        IAsyncEnumerable asyncEnumerable = source.GetAsyncEnumerable();
        HandlerTask = Task.Run(() => handleAsyncResultsAsTheyHappen(asyncEnumerable));
        int n = await someOtherTask();
        source.YieldReturn(n);
        var r = await ChildMethod(source);
        source.Complete();  // this call would cause the HandlerTask to complete.
        return r;
    }

    private async Task<string> ChildMethod(AsyncEnumerableSource<int> source) {
        source.YieldReturn(5);
        await SomeOtherCall();
        source.YieldReturn(10);
        return "hello";
    } …
Run Code Online (Sandbox Code Playgroud)

c# asynchronous c#-8.0 iasyncenumerable

7
推荐指数
2
解决办法
3732
查看次数

为什么我不允许在返回 IAsyncEnumerable 的方法中返回 IAsyncEnumerable

我有以下界面:

public interface IValidationSystem<T>
{
    IAsyncEnumerable<ValidationResult> ValidateAsync(T obj);
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试以这种方式实现它:

public class Foo
{ }

public class Bar
{ }

public class BarValidationSystem : IValidationSystem<T>
{   
    public async IAsyncEnumerable<ValidationResult> ValidateAsync(Bar bar)
    {
        var foo = await GetRequiredThingAsync();

        return GetErrors(bar, foo).Select(e => new ValidationResult(e)).ToAsyncEnumerable();
    }

    private static IEnumerable<string> GetErrors(Bar bar, Foo foo)
    {
        yield return "Something is wrong";
        yield return "Oops something else is wrong";
        yield return "And eventually, this thing is wrong too";
    }
    
    private Task<Foo> GetRequiredThingAsync()
    {
        return Task.FromResult(new …
Run Code Online (Sandbox Code Playgroud)

c# iasyncenumerable

7
推荐指数
2
解决办法
649
查看次数

如何使用 .NET 6 在 C# 中使用 IAsyncEnumerable 从最小 API 中“流式传输”搜索结果?

概述

我们正在将数据库访问转移到 API 调用,并且我需要从数据库返回使用该 API 找到的搜索结果。计划是使用 IAsyncEnumerable,但我在处理 HttpClient 缓冲区时遇到了麻烦(至少我认为)。该调用由 WPF 客户端上的按钮单击触发,该按钮将搜索词发送到客户端 API 服务。该服务发出 API 请求,然后使用存储库来完成工作。我使用的是最小的 API,客户端和 API 都使用 .Net 6。

问题

我遇到的问题是,虽然 IAsyncEnumerable 部分在 API 端工作,每次返回一个条目,但整个结果仍然作为单个响应传回,而不是一次返回一个响应。

信息与问题

此时,我已经将其简化,只是为了尝试让这个概念发挥作用。当不使用 HttpClient 时,IAsyncEnumerable 部分在客户端 ApiService 本身内工作得很好,但一旦引入它,我就开始遇到问题。您可以在 GetTestStreamAsync 方法的区域中看到我尝试过的各种解决方案。

所以我想主要问题之一是,IAsyncEnumerable 是否可以做到这一点?如果没有,解决方案是什么?

客户端代码

MainWindow.xaml.cs

private async void btnSearch_Click(object sender, RoutedEventArgs e)
{
    // This works
    //var result = apiService.GetTestAsync();
    // This doesn't
    var result = apiService.GetTestStreamAsync(txtSearchTerms.Text);

    await foreach(var item in result!)
    {
        lstResults.Items.Add(item);
    }
}
Run Code Online (Sandbox Code Playgroud)

主窗口.xaml

<Grid>
    <TextBox x:Name="txtSearchTerms"
                HorizontalAlignment="Left"
                Margin="86,92,0,0"
                TextWrapping="Wrap"
                VerticalAlignment="Top"
                Width="340"
                TabIndex="1" …
Run Code Online (Sandbox Code Playgroud)

api wpf iasyncenumerable .net-6.0 minimal-apis

7
推荐指数
0
解决办法
929
查看次数