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. Datatables を値で渡したいのですが、Default は値で渡されますか? その配列が不要になったので、null に設定したいのはそのためです。
4

2 に答える 2

1

.NET ランタイムは不要になったオブジェクトを破棄します。オブジェクトが null であることを指定する必要はありません。悲惨な状況でない限り、ガベージ コレクターを自分で呼び出す必要もありません。

したがって、答えはノーです。その行は不要であり、私の意見ではお勧めしません。

于 2013-03-16T11:20:47.273 に答える
1

誰もがすぐにこれを却下しますが、実際にはまったく役に立たないわけではありません。オブジェクトを null に設定するほとんどのコードは、これではなくジッター オプティマイザーによって最適化されます。ローカル変数ではなく、フィールドを nullに設定するためです。

配列への参照を削除することがうまくいくまれなケースがあります。配列が大きく、21250 要素を超える場合は特にそうです。配列参照を null に設定すると、通常よりも早い段階でガベージ コレクションを実行できます。これは、「someclass」オブジェクトがガベージコレクションされるときです。

繰り返しになりますが、この特定のケースでは、配列に何万もの要素を持たない方がよいでしょう。これは、スレッドプールに大きな圧力をかけることになります。したがって、理想的には、これは決して気付かないようなマイクロ最適化です。

于 2013-03-16T13:00:35.743 に答える