C# NET中并行任务的线程安全

C# NET中并行任务的线程安全,c#,.net,multithreading,thread-safety,task-parallel-library,C#,.net,Multithreading,Thread Safety,Task Parallel Library,任务并行库的委托的内部是线程安全的吗?即,在该委托中声明的变量值是否与该线程隔离 例如: Parallel.ForEach(collection, item => { var something = new Something(item.Property); }); 某个东西保证始终是线程的唯一,防止被同一并行操作创建的另一个线程覆盖?因为这是一个委托某物是一个局部变量,如果它是值类型,则肯定是线程安全的-当然,如果变量持有对共享引用对象的引用,则仍然可以覆盖它(例如,对代理用作

任务并行库的委托的内部是线程安全的吗?即,在该委托中声明的变量值是否与该线程隔离

例如:

Parallel.ForEach(collection, item => {
    var something = new Something(item.Property);
});

某个东西
保证始终是线程的唯一,防止被同一
并行
操作创建的另一个线程覆盖?

因为这是一个委托某物是一个局部变量,如果它是值类型,则肯定是线程安全的-当然,如果变量持有对共享引用对象的引用,则仍然可以覆盖它(例如,对代理用作闭包的变量的引用)

因此,如果
集合
有10个项目,并且TPL生成10个线程,那么所有10个线程都有可能对
某物
的相同引用进行寻址?前提是集合中有10个相同的引用。据推测,集合中的每个条目都有唯一的对象。如果集合中添加了相同的对象,则它多次出现,那么你可能会有“东西”引用内存中的同一个对象。@lukiffer:如果你的示例真的是你在委托中所做的,那么不是,每个线程都会单独引用一个新的
对象
对象。最近,当我使用并行库时,有一个BackgroundWorker和一个计时器处理大量数据。基本上,BackgroundWorker和Timer允许多个实例启动,但每个worker最终都在同一个集合上工作。丑陋的竞争条件。愚蠢的错误。@ChrisSinclair-关于
集合中的重复项的观点很好,但在任何情况下读取属性通常都是线程安全的。如下所述,此示例是线程安全的。但这是n当使用TPL时,ot总是/自动地改变这种情况。确保任务独立或线程安全仍然是程序员的主要责任。没有编译器警告,没有工具。