0

假设我有一个数据表数组,对于该数组中的每个数据表,我将启动一个线程来进行一些处理。

class someclass()
    {
        private DataTable[] DataTableArray;

        someclass(DataTable sometable)
        {
            //divide sometable and distribute them to  DataTableArray
        }


        private void startThreads()
        {

             for (int i = 0; i < DataTableArray.Count(); i++)
                {
                    Task.Factory.StartNew(() => Downloader(DataTableArray[i]));
                }

                DataTableArray = null; //is this line necessary?
        }
    }

在我的startThreads()

  1. 启动所有线程后,我可以设置 DataTableArray = null 吗?
  2. 我想按值传递数据表,它们是否按值传递默认值?这就是为什么我想将其设置为 null 因为不再需要该数组
4

2 回答 2

1

.NET 运行时将处理不再需要的任何对象,您无需指定对象为空。除非在紧急情况下,否则您也不需要自己致电垃圾收集器。

所以答案是否定的。那条线是不必要的,在我看来,不推荐。

于 2013-03-16T11:20:47.273 回答
1

每个人都很快忽略了这一点,但它实际上并不是完全没用的。大多数将对象设置为 null 的代码都会被抖动优化器优化掉,而不是这个。因为它将字段设置为空,而不是局部变量。

在某些极端情况下,删除对数组的引用可以获得回报。特别是当数组很大时,超过 21250 个元素。将数组引用设置为 null 可以让其提前被垃圾回收,比正常情况更早。这就是“someclass”对象被垃圾收集的时候。

再说一次,在这种特定情况下,数组中最好不要有数万个元素,这会给线程池带来很大压力。所以理想情况下,这将是一个你永远不会注意到的微优化。

于 2013-03-16T13:00:35.743 回答