标签:ati str mis visual 微软 like value complete yield
在目前版本中异步迭代使用 yield return 的暂时解决方案说明。
上一篇简单示范了在类中实践 Async Stream 的方式, 如果今天是一个方法要回传 IAsyncEnumerable
我们一样就拿 ReadLineAsync 来示范,首先建立一个类实践 IAsyncEnumerator
internal class AsyncEnumerator : IAsyncEnumerator
{
private readonly StreamReader _reader;
private bool _disposed;
public string Current { get; private set; }
public AsyncEnumerator(string path)
{
_reader = File.OpenText(path);
_disposed = false;
}
async public ValueTask MoveNextAsync()
{
var result = await _reader.ReadLineAsync();
Current = result;
return result != null;
}
async public ValueTask DisposeAsync()
{
await Task.Run(() => Dispose());
}
private void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
private void Dispose(bool disposing)
{
if (!this._disposed)
{
if (_reader != null)
{
_reader.Dispose();
}
_disposed = true;
}
}
}
接着建立另外一个类, 这个类很简单,只包含一个静态的方法 async static public IAsyncEnumerable
async static public IAsyncEnumerable ReadLineAsync(string path)
{
var enumerator = new AsyncEnumerator(path);
try
{
while (await enumerator.MoveNextAsync())
{
await Task.Delay(100);
yield return enumerator.Current;
}
}
finally
{
await enumerator.DisposeAsync();
}
}
}
程序没有错,但编译过不了,观察一下错误消息:
error CS0656: Missing compiler required member ‘System.Threading.Tasks.ManualResetValueTaskSourceLogic`1.GetResult‘很明显,编译器需要两个类型 (1)? System.Threading.Tasks.ManualResetValueTaskSourceLogic
using System;
using System.Runtime.CompilerServices;
using System.Threading.Tasks.Sources;
namespace System.Threading.Tasks{
internal struct ManualResetValueTaskSourceLogic
{
private ManualResetValueTaskSourceCore _core;
public ManualResetValueTaskSourceLogic(IStrongBox> 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
补上去后就大功告成,可以快乐地异步 yielld return。故事还没完,待续........
原文:大专栏 C# 8.0 抢先看 -- Async Stream (2)
C# 8.0 抢先看 -- Async Stream (2)
标签:ati str mis visual 微软 like value complete yield
原文地址:https://www.cnblogs.com/petewell/p/11457971.html