私はマルチスレッド化に新しいので、値を受け取る方法で列挙子を作成しようとしていますが、バックグラウンドで処理を続けます。スレッドからの値の処理yield returnの実行
は、私はこのように、最終的なクラスを使用することができるようにしたい:
while (await asyncEnumerator.MoveNextAsync())
{
T result = asyncEnum.Current;
//Do Something
}
しかし、私はそれが私はwhileループで何かをやっている間に次の結果を得ていきたいと思います。
コメント:各結果は前の結果に依存するので、それを並列に処理することができません。
私は多分キューの結果を持っていると思って、キュー内の最初の結果を返している間に結果を得るためにスレッドを処理していましたが、これを動作させることはできません。これは私の試みですが、私は何をすべきか分からないMoveNext()
:私はコード私が知りたいのですが、これを行うには良い方法があるかどうかは明らか
public class AsyncEnumerator<T>
{
private object _sync = new object();
private readonly Queue<T> _queue;
private readonly IEnumerable<T> _enumerable;
public AsyncEnumerator(IEnumerable<T> enumerable)
{
_enumerable = enumerable;
_queue = new Queue<T>();
}
/// <summary>
/// Start getting results when requested the firstTime
/// </summary>
private bool _startFlag;
public async Task<bool> MoveNextAsync()
{
if (_finished)
{
return false;
}
if (!_startFlag)
{
_startFlag = true;
SetResultsAsync();
}
if (_queue.Count > 0)
{
Current = _queue.Dequeue();
return true;
}
//What here?
return await Task.Run(()=> true);
}
private T _current;
public T Current
{
get
{
lock (_sync)
{
return _current;
}
}
private set { _current = value; }
}
private bool _finished;
private async Task SetResultsAsync()
{
IEnumerator<T> enumerator = _enumerable.GetEnumerator();
bool moveNext = await Task.Run(() => enumerator.MoveNext());
while (moveNext)
{
_queue.Enqueue(enumerator.Current);
moveNext = await Task.Run(() => enumerator.MoveNext());
}
_finished = true;
}
}
を更新しました
、Iマルチスレッド化に新しいです。
あなたはおそらく問題を引き起こすasync voidメソッドを使用すべきではありません。 MoveNextAsync asyncを作成し、SetResultsAsyncがタスクを返すようにします。ところで、 'IAsyncEnumerable'と 'IAsyncEnumerator 'があります。 –
@CamiloTerevintoまだ 'MoveNextAsync()'で私を助けません... コード内のものを修正しました – tjw
SetResultsAsyncはMoveNextAsyncで待っています。それ以外に、キューが空の場合、それはすべてのアイテムがすでに処理されたということではありませんか?その場合はfalseを返します。 –