C#线程安全集合ConcurrentDictionary
这个在System.Collections.Concurrent的字典类跟字典Dictionary的使用差不多是一样的,但在多线程并发访问的时候,只能靠ConcurrentDictionary了。
这是我之前储存多个SineTones的频率范围使用Dictionary用多线程并发访问:
public static Dictionary<double, Tuple<double, double>> FreqRange { get; set; }
public static void CalcSineTones()
{
FreqRange = new Dictionary<double, Tuple<double, double>>();
Parallel.ForEach(OrderTrackDicResult, pair =>
{
SineTonesDic[pair.Key] = CalcAmp(pair.Key, pair.Value);
SineTonesDicResult[pair.Key] = SineTonesDic[pair.Key];
});
}
private static void CalcAmp(double order, double[][] otrkBuffer)
{
double minfreq,maxfreq;
GetMaxMinFreq(order, otrkBuffer[0], out minfreq, out maxfreq);
FreqRange[order] = new Tuple<double, double>(minfreq, maxfreq);
}
结果报System.NullRefrenceException错误:
将Dictionary替换为ConcurrentDictionary:
public static ConcurrentDictionary<double, Tuple<double, double>> FreqRange { get; set; }
public static void CalcSineTones()
{
FreqRange = new ConcurrentDictionary<double, Tuple<double, double>>();
Parallel.ForEach(OrderTrackDicResult, pair =>
{
SineTonesDic[pair.Key] = CalcAmp(pair.Key, pair.Value);
SineTonesDicResult[pair.Key] = SineTonesDic[pair.Key];
});
}
private static void CalcAmp(double order, double[][] otrkBuffer)
{
double minfreq,maxfreq;
GetMaxMinFreq(order, otrkBuffer[0], out minfreq, out maxfreq);
FreqRange[order] = new Tuple<double, double>(minfreq, maxfreq);
}
运行没有问题!