小编Con*_*ern的帖子

在解除集合时,如何让json.net排除空值?

我有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.谢谢.

c# json json.net

9
推荐指数
1
解决办法
3988
查看次数

Thread.Sleep阻止并行执行任务

我正在调用一个调用数据库的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中运行.

c# multithreading plinq task-parallel-library

4
推荐指数
1
解决办法
4559
查看次数