我有JSON,我回来可能会返回null作为值的一部分.我怎么能,或者甚至有办法从集合中排除那些空值?
{
"id": "5551212",
"from": {
"name": "Message creator",
"start_time": "2011-10-21T22:00:00",
"end_time": "2011-10-23T17:00:00",
"location": "area 51",
"id": "2121212122"
},
"to": {
"data": [
{
"name": "Jay-Z",
"id": "77777"
},
{
"name": "Bill Murray",
"id": "88888"
},
null,
{
"name": "Anthony Hopkins",
"id": "99999"
}
]
},
"message": "Some message from somewhere",
"updated_time": "2011-09-19T23:53:51+0000",
"unread": 1,
"unseen": 0
}
Run Code Online (Sandbox Code Playgroud)
Bill Murray和Anthony Hopkins之间的通知是返回的null.谢谢.
我正在调用一个调用数据库的worker方法,然后迭代并生成并行处理的返回值.为了防止它锤击数据库,我在那里有一个Thread.Sleep来暂停执行到DB.但是,这似乎是在Parallel.ForEach中仍然发生的阻塞执行.实现这一目标以防止阻塞的最佳方法是什么?
private void ProcessWorkItems()
{
_cancellation = new CancellationTokenSource();
_cancellation.Token.Register(() => WorkItemRepository.ResetAbandonedWorkItems());
Task.Factory.StartNew(() =>
Parallel.ForEach(GetWorkItems().AsParallel().WithDegreeOfParallelism(10), workItem =>
{
var x = ItemFactory(workItem);
x.doWork();
}), _cancellation.Token);
}
private IEnumerable<IAnalysisServiceWorkItem> GetWorkItems()
{
while (!_cancellation.IsCancellationRequested)
{
var workItems = WorkItemRepository.GetItemList(); //database call
workItems.ForEach(item =>
{
item.QueueWorkItem(WorkItemRepository);
});
foreach (var item in workItems)
{
yield return item;
}
if (workItems.Count == 0)
{
Thread.Sleep(30000); //sleep this thread for 30 seconds if no work items.
}
}
yield break;
}
Run Code Online (Sandbox Code Playgroud)
编辑:我改变它以包括答案,它仍然没有像我期待的那样工作.我将.AsParallel().WithDegreeOfParallelism(10)添加到GetWorkItems()调用中.当我认为即使基本线程正在睡眠时Parallel仍应继续执行,我的期望是否正确?
示例:我有15个项目,它迭代并抓取10个项目并启动它们.当每个人完成时,它会从GetWorkItems请求另一个,直到它试图要求第16个项目.此时它应该停止尝试获取更多项目,但应继续处理项目11-15,直到完成.是应该如何并行工作?因为它目前没有这样做.它目前正在做的是当它完成6时,它会锁定后续的10个仍然在Parallel.ForEach中运行.