
废话不多,代码:
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
namespace ParallelTest
{
class Program
{
static void Main(string[] args)
{
List<Product> products = new List<Product>();
Parallel.For(0, 1000000, (i) =>
{
Product product = new Product();
product.Name = "name" + i;
product.Category = "Category" + i;
product.SellPrice = i;
products.Add(product);
});
Console.WriteLine(products.Count);
Console.ReadLine();
}
}
class Product
{
public string Name { get; set; }
public string Category { get; set; }
public int SellPrice { get; set; }
}
}

猜猜运算结果是999999?对不起线程安全问题代码,结果! = 999999.


运行结果
Net 4.0引入了System.Threading.Tasks,它简化了我们在不直接处理线程和线程池的情况下进行异步编程的方式,但同时也引入了线程安全性问题.

System.Threading.Task中的类型称为任务并行库(TPL). TPL使用CLR线程池(表明使用TPL创建的线程都是后台线程)将应用程序的工作自动分配给可用的CPU.
并行是指数据并行性. 它提供的Parallel.For()或Parallel.ForEach()方法可以迭代数组或并行集合中的数据.

出现此结果的原因显然是由多线程操作的集合引起的线程安全问题.
简而言之,在操作多线程集合时,无论是通过Thread,ThreadPool,Task,Parallel还是PLINQ,我们都必须注意线程安全性问题.
解决方案很简单:
使用并发集合(System.Collections.ConCurrent)锁定
对于这个问题,我知道它有潜在的线程安全性问题,但是我不确定结果如何. 当我截屏并询问没有结果时,我想到了编写演示以验证问题. 这也是我写这篇文章的初衷: 提醒自己,如果遇到问题线程安全问题代码,请不要从头开始猜测,并决心亲自进行验证.
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-226333-1.html
送钱