Буферизация iAsyncenumerable в сценарии производителя/потребителейC#

Место общения программистов C#
Ответить
Anonymous
 Буферизация iAsyncenumerable в сценарии производителя/потребителей

Сообщение Anonymous »

У меня есть сценарий, в котором я читаю некоторые данные из базы данных. Эти данные возвращаются в форме iAsyncenumerable . После прочтения данных я хочу отправить их потребителю. Этот потребитель асинхронно. Прямо сейчас мой код выглядит примерно так: < /p>

Код: Выделить всё

// C#
IAsyncEnumerable enumerable = this.dataSource.Read(query);

await foreach (var data in enumerable)
{
await this.consumer.Write(data);
}
< /code>
Моя проблема в том, что, пока я перечисляю базу данных, я держу блокировку на данные. Я не хочу держать этот замок дольше, чем мне нужно. С готовно прочитать из дата данных, просто не вызывая толист 
или holistasync . Я хочу избежать чтения всех данных в память одновременно, что вызвало бы противоположную проблему, если теперь производитель медленнее, чем потребитель. Это нормально, если блокировка в базе данных не максимально короткая, я хочу настраиваемый компромисс между тем, сколько данных находится в памяти одновременно, и как долго мы сохраняем перечисление. < /P>
Я думаю, что будет какой-то способ использовать очередь или каналу, похожую на канал, чтобы выступить в качестве буфера между производителем и потребителем. < /p>

Код: Выделить всё

// go
queue := make(chan MyData, BUFFER_SIZE)
go dataSource.Read(query, queue)

// Read sends data on the channel, closes it when done

for data := range queue {
consumer.Write(data)
}
Есть ли способ получить аналогичное поведение в C#?


Подробнее здесь: https://stackoverflow.com/questions/741 ... r-scenario
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»