2

IAsyncEnumerable を使用した LINQのチャットを見て、 IAsyncEnumerablesの拡張メソッドを処理する方法についての洞察を得ることができましたが、率直に言って、実際のアプリケーション、特に私の経験レベルでは十分に詳しく説明されていませんでした。IAsyncEnumerables のドキュメントはまだ実際には存在しません

IAsyncEnumerableファイルから読み取り、ストリームで何らかの変換を行い、 を返し、次のように、任意の数のオブジェクトが取得された後にそれらのオブジェクトを下流に送信しようとしています。

await foreach (var data in ProcessBlob(downloadedFile))
{
    //todo add data to List<T> called listWithPreConfiguredNumberOfElements
    if (listWithPreConfiguredNumberOfElements.Count == preConfiguredNumber)
        await _messageHandler.Handle(listWithPreConfiguredNumberOfElements);
        
    //repeat the behaviour till all the elements in the IAsyncEnumerable returned by ProcessBlob are sent downstream to the _messageHandler.
}

ここまで読んで分かったのは、この行はs (またはs)await foreachを使用するデータに取り組んでいるため、前もってカウントしていないということです。また、スレッド間でそのデータを共有することはあまりスレッドセーフではないように見えるため、リスト変数を使用して長さチェックを行うこともためらっています。TaskValueTask

System.Linq.Async関連する拡張メソッドを使用できることを期待して、パッケージを使用しています。の形でいくつかの約束を見ることができますTakeWhileが、私がしようとしているタスクがどれほどスレッドセーフであるかについての私の理解はすべてではなく、自信を失います.

正しい方向への助けやプッシュは大歓迎です、ありがとう。

4

2 に答える 2

2

また、スレッド間でそのデータを共有することはあまりスレッドセーフではないように見えるため、リスト変数を使用して長さチェックを行うこともためらっています。

を扱うときは、スレッドではなく、実行フローの観点から考える必要がありますasync。処理ステップを実行しているawaitため、実際にはリストにアクセスする同時実行性の問題はありません。これは、使用されるスレッドに関係なく、リストは一度に 1 回しかアクセスされないためです。

それでも心配な場合は、newバッチごとにリストを作成できますが、それはおそらくやり過ぎです。ただし、バッチ間のリセットと最終処理ステップの 2 つの追加が必要です

var listWithPreConfiguredNumberOfElements = new List<YourType>(preConfiguredNumber);
await foreach (var data in ProcessBlob(downloadedFile)) // CAF?
{
    listWithPreConfiguredNumberOfElements.Add(data);
    if (listWithPreConfiguredNumberOfElements.Count == preConfiguredNumber)
    {
        await _messageHandler.Handle(listWithPreConfiguredNumberOfElements); // CAF?
        listWithPreConfiguredNumberOfElements.Clear(); // reset for a new batch
        // (replace this with a "new" if you're still concerned about concurrency)
    }
}
if (listWithPreConfiguredNumberOfElements.Any())
{   // process any stragglers
    await _messageHandler.Handle(listWithPreConfiguredNumberOfElements); // CAF?
}

マークされた 3 つのスポットで使用することもできます。ConfigureAwait(false)// CAF?

于 2020-07-29T12:24:47.040 に答える