【发布时间】:2012-01-11 10:54:09
【问题描述】:
这是这样的场景:在一个单独的任务中,我从一个数据读取器读取数据,该数据读取器表示一个带有字符串 JSON 的单列结果集。在该任务中,我将 JSON 字符串添加到包装 ConcurrentQueue 的 BlockingCollection。同时在主线程中我 TryTake/dequeue 从集合中提取一个 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);
}
【问题讨论】:
标签: json c#-4.0 deserialization task-parallel-library