C# - List.ToArray()为单个元素花费几个ms

时间:2018-03-25 11:15:32

标签: c# multithreading performance blocking toarray

我有以下代码,由于某种原因,ToArray()方法对于单个元素需要7ms。该应用程序有几个工作线程,其中发生了这种情况,我也用JetBrains dotTrace对应用程序进行了分析,这表明该线程正在等待另一个(此时不仅仅是等待CPU),这显然是不可能的,因为List是一个局部变量,我不使用锁。

List<TransactionType> transactionTypes = 
   new List<TransactionType>(_TransactionTypes.LengthNull() + 
   drawingAction._TransactionTypes.LengthNull())
...
Stopwatch sw = Stopwatch.StartNew();
_TransactionTypes = transactionTypes.ToArray();
sw.Stop();
if (sw.ElapsedMilliseconds > 3)
{
  int deb = 0;
}

这种现象几乎发生在使用.Net框架的方法的每一点(例如String.Format)。我现在有这个问题已经有一段时间了,由于某种原因在主线程中使用SpinWait会让它更糟糕。

我和我的同事都没有对此做出解释,谷歌也没有帮助,所以我非常感谢你的帮助。

发现问题:
或者至少是其中的一部分。它似乎是由GC压力引起的,我已经知道如何在应用程序中减少它。我仍然不知道为什么SpinWait有时会导致线程阻塞,但我只是不使用它。

这个问题被标记为重复,Stack Overflow告诉我编辑它来解释原因,但说实话,如果你甚至懒得读过标题,那就不是很明显了。

1 个答案:

答案 0 :(得分:0)

我刚刚查看了.NET源代码,因为我自己对thios问题感兴趣。显然,它只是将列表数组的当前内容复制到一个新数组中。

T[] array = new T[_size];
Array.Copy(_items, 0, array, 0, _size);   //_items is the lists inner array     
return array;

除了复制之外别无其他。