Это сценарий: в отдельной задаче я читаю из устройства чтения данных, которое представляет собой результирующий набор из одного столбца со строкой, JSON.В этой задаче я добавляю строку JSON в коллекцию BlockingCollection, которая оборачивает ConcurrentQueue.В то же время в основном потоке я пытаюсь / удаляю строку JSON из коллекции, а затем возвращаю ее возвращаемую десериализованной.
Чтение из базы данных и десериализация примерно с одинаковой скоростью, поэтому не будетслишком большое потребление памяти, вызванное большой коллекцией BlockingCollection.
Когда чтение из базы данных завершено, задача закрывается, и я затем десериализую все не десериализованные строки JSON.
Вопросы/ мысли:
1) Блокирует ли TryTake, чтобы невозможно было добавить?
2) Не делайте этого.Просто сделайте это серийно и верните доходность.
using (var q = new BlockingCollection<string>())
{
Task task = null;
try
{
task = new Task(() =>
{
foreach (var json in sourceData)
q.Add(json);
});
task.Start();
while (!task.IsCompleted)
{
string json;
if (q.TryTake(out json))
yield return Deserialize<T>(json);
}
Task.WaitAll(task);
}
finally
{
if (task != null)
{
task.Dispose();
}
q.CompleteAdding();
}
foreach (var e in q.GetConsumingEnumerable())
yield return Deserialize<T>(e);
}