C# 将数据划分为块,然后确保线程安全

C# 将数据划分为块,然后确保线程安全,c#,multithreading,task-parallel-library,plinq,C#,Multithreading,Task Parallel Library,Plinq,我正在编写一些代码,这些代码基本上从套接字接收数据,执行反序列化,然后传递给我的应用程序。反序列化的对象可以按其id分组(id是在反序列化过程中生成的) 为了提高应用程序的性能,我想使用C#4.0附带的新并行功能。我唯一的限制是两个线程不能访问具有相同id的对象。现在我知道,我可以对将放置在对象内部的同步对象执行lock(),但我希望避免这些锁(这里的性能是一个问题) 我考虑过的设计: 创建某种分区器,它将按ID分割数据(这将确保我得到的每个缓冲区始终具有相同的对象ID组) 使用PLINQ的TP

我正在编写一些代码,这些代码基本上从套接字接收数据,执行反序列化,然后传递给我的应用程序。反序列化的对象可以按其id分组(id是在反序列化过程中生成的)

为了提高应用程序的性能,我想使用C#4.0附带的新并行功能。我唯一的限制是两个线程不能访问具有相同id的对象。现在我知道,我可以对将放置在对象内部的同步对象执行lock(),但我希望避免这些锁(这里的性能是一个问题)

我考虑过的设计:

  • 创建某种分区器,它将按ID分割数据(这将确保我得到的每个缓冲区始终具有相同的对象ID组)
  • 使用PLINQ的TPL分配线程

  • 有人能给我推荐一些这样做的资源吗?

    在为多处理器或内核开发时,我会推荐
    PLINQ

    PLINQ是一个查询执行引擎,它接受任何LINQtoObject或LINQtoXML查询,并在可用时自动利用多个处理器或内核执行。编程模型的变化很小,这意味着您不需要成为并发专家就可以使用它。事实上,螺纹和锁甚至不会出现,除非你真的想潜到引擎盖下面去了解它是如何工作的。PLINQ是Parallel FX的关键组件,Parallel FX是Microsoft®.NET Framework中的下一代并发支持

    涵盖范围:

    • 从林克到普林克
    • PLINQ编程模型
    • 处理查询输出
    • 并发异常
    • 输出结果中的排序
    • 副作用
    • 让PLINQ发挥作用

    我完全同意PLINQ是一个很好的开始,但问题是:如果我有两个线程处理对象列表(在反序列化之后-注意缓冲区不断到达,这些消息在我的系统中不断浮动),并且有一些属性(即id属性),那么现在我需要对其进行分区(按id)并将其转发给线程(使用as并行方法)在我的应用程序中。我如何确保每个id相同的项目都会发送到一个不需要锁定的线程?@Tzahi听起来像是你需要查看的。或者,如果传入的对象确实与处理并发(并且可能永远不会结束)那么,也许是一个更好的起点。concurrentQueue还不够好,因为这让我回到了当前的解决方案——所有的东西都被推到队列中,线程处理所有的数据。另一方面,这在我的系统中造成了瓶颈,CPU利用率非常低。我正在检查反应式扩展解决方案-这看起来很有希望…很快就通知你。反应扩展确实很有趣,这似乎是我的解决方案。谢谢Richard!