gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 18:21:30 25 4
gpt4 key购买 nike

我正在玩 C# 8.0 预览版,但无法获得 IAsyncEnumerable去工作。

我尝试了以下

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

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

  1. 错误 CS1061 ' IAsyncEnumerable<int> ' 不包含 'GetAwaiter 的定义| ' 并且没有可访问的扩展方法 ' GetAwaiter '接受类型为'IAsyncEnumerable<int>的第一个参数' 可以找到(您是否缺少 using 指令或程序集引用?)
  2. 错误 CS1624 正文“Program.Get()” ' 不能是迭代器 block ,因为 ' IAsyncEnumerable<int> ' 不是迭代器接口(interface)类型

我在这里错过了什么?

最佳答案

这是编译器中的一个错误,可以通过添加几行代码来修复 found here :

namespace System.Threading.Tasks
{
using System.Runtime.CompilerServices;
using System.Threading.Tasks.Sources;

internal struct ManualResetValueTaskSourceLogic<TResult>
{
private ManualResetValueTaskSourceCore<TResult> _core;
public ManualResetValueTaskSourceLogic(IStrongBox<ManualResetValueTaskSourceLogic<TResult>> parent) : this() { }
public short Version => _core.Version;
public TResult GetResult(short token) => _core.GetResult(token);
public ValueTaskSourceStatus GetStatus(short token) => _core.GetStatus(token);
public void OnCompleted(Action<object> continuation, object state, short token, ValueTaskSourceOnCompletedFlags flags) => _core.OnCompleted(continuation, state, token, flags);
public void Reset() => _core.Reset();
public void SetResult(TResult result) => _core.SetResult(result);
public void SetException(Exception error) => _core.SetException(error);
}
}

namespace System.Runtime.CompilerServices
{
internal interface IStrongBox<T> { ref T Value { get; } }
}

正如 Mads Torgersen 在 Take C# 8 for a spin 中解释的那样:

But if you try compiling and running it, you get an embarassing number of errors. That’s because we messed up a bit, and didn’t get the previews of .NET Core 3.0 and Visual Studio 2019 perfectly aligned. Specifically, there’s an implementation type that async iterators leverage that’s different from what the compiler expects.

You can fix this by adding a separate source file to your project, containing this bridging code. Compile again, and everything should work just fine.

更新

当在异步迭代器中使用 Enumerable.Range() 时,看起来还有另一个错误。

问题中的 GetNumbersAsync() 方法仅在两次迭代后结束:

static async Task Main(string[] args)
{
await foreach (var num in GetNumbersAsync())
{
Console.WriteLine(num);
}
}

private static async IAsyncEnumerable<int> GetNumbersAsync()
{
var nums = Enumerable.Range(0, 10);
foreach (var num in nums)
{
await Task.Delay(100);
yield return num;
}
}

这只会打印:

0
1

数组或其他迭代器方法不会发生这种情况:

private static async IAsyncEnumerable<int> GetNumbersAsync()
{
foreach (var num in counter(10))
{
await Task.Delay(100);
yield return num;
}
}

private static IEnumerable<int> counter(int count)
{
for(int i=0;i<count;i++)
{
yield return i;
}
}

这将打印预期的:

0
1
2
3
4
5
6
7
8
9

更新 2

这似乎也是一个已知错误:Async-Streams: iteration stops early on Core

关于c# - IAsyncEnumerable 在 C# 8.0 预览中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53651322/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com