C# 将数据划分为块,然后确保线程安全
我正在编写一些代码,这些代码基本上从套接字接收数据,执行反序列化,然后传递给我的应用程序。反序列化的对象可以按其id分组(id是在反序列化过程中生成的) 为了提高应用程序的性能,我想使用C#4.0附带的新并行功能。我唯一的限制是两个线程不能访问具有相同id的对象。现在我知道,我可以对将放置在对象内部的同步对象执行lock(),但我希望避免这些锁(这里的性能是一个问题) 我考虑过的设计:C# 将数据划分为块,然后确保线程安全,c#,multithreading,task-parallel-library,plinq,C#,Multithreading,Task Parallel Library,Plinq,我正在编写一些代码,这些代码基本上从套接字接收数据,执行反序列化,然后传递给我的应用程序。反序列化的对象可以按其id分组(id是在反序列化过程中生成的) 为了提高应用程序的性能,我想使用C#4.0附带的新并行功能。我唯一的限制是两个线程不能访问具有相同id的对象。现在我知道,我可以对将放置在对象内部的同步对象执行lock(),但我希望避免这些锁(这里的性能是一个问题) 我考虑过的设计: 创建某种分区器,它将按ID分割数据(这将确保我得到的每个缓冲区始终具有相同的对象ID组) 使用PLINQ的TP
有人能给我推荐一些这样做的资源吗?在为多处理器或内核开发时,我会推荐
PLINQ
PLINQ是一个查询执行引擎,它接受任何LINQtoObject或LINQtoXML查询,并在可用时自动利用多个处理器或内核执行。编程模型的变化很小,这意味着您不需要成为并发专家就可以使用它。事实上,螺纹和锁甚至不会出现,除非你真的想潜到引擎盖下面去了解它是如何工作的。PLINQ是Parallel FX的关键组件,Parallel FX是Microsoft®.NET Framework中的下一代并发支持
涵盖范围:
- 从林克到普林克
- PLINQ编程模型
- 处理查询输出
- 并发异常
- 输出结果中的排序
- 副作用
- 让PLINQ发挥作用
我完全同意PLINQ是一个很好的开始,但问题是:如果我有两个线程处理对象列表(在反序列化之后-注意缓冲区不断到达,这些消息在我的系统中不断浮动),并且有一些属性(即id属性),那么现在我需要对其进行分区(按id)并将其转发给线程(使用as并行方法)在我的应用程序中。我如何确保每个id相同的项目都会发送到一个不需要锁定的线程?@Tzahi听起来像是你需要查看的。或者,如果传入的对象确实与处理并发(并且可能永远不会结束)那么,也许是一个更好的起点。concurrentQueue还不够好,因为这让我回到了当前的解决方案——所有的东西都被推到队列中,线程处理所有的数据。另一方面,这在我的系统中造成了瓶颈,CPU利用率非常低。我正在检查反应式扩展解决方案-这看起来很有希望…很快就通知你。反应扩展确实很有趣,这似乎是我的解决方案。谢谢Richard!