1

次の機能を持つWindowsサービスとしてホストされているwcfサービスがあります。

public int SendMultipleMessages(List<Message> messages)
{
  foreach (var message in messages)
  {
     //Do some stuff with the messages ie. get an id to return, save info in a db.
  }

  //Would it make sence to collect here ??
  Gc.Collect();

  Task.Factory.StartNew(() =>
        {
            //very time demanding task
            _sendRequestHandler.SendMultipleMessages(BatchId);
        });

 return BatchId;
}

List <Message>オブジェクトは(ほとんどの場合)最大1 GBのメモリを使用しますが、GCを呼び出すのは理にかなっています。リストを使用しなくなったため、このような状況で収集するか、ガベージコレクターに許可する必要があります。これを自分で処理しますか?

4

2 に答える 2

5

簡単な答え:いいえ

に電話するとGC.Collect()、問題が発生している可能性があります。これを呼び出す必要があることは非常にまれです。

現在の例では、現在のコードでは役に立ちません。オブジェクトのリストを物理的にクリアしない限り、呼び出し元はそのインスタンス内のオブジェクトへの参照をまだ保持しているため、Messageガベージ コレクションは行われません。List<T>

もちろん、そのアドバイスは、各Messageオブジェクトへの他の参照が存在しないという前提に基づいています。

処理されたメッセージ オブジェクトを から削除するか、順序付け要件に応じてまたはList<T>など、この原則を本質的に具現化するデータ構造に切り替えることで、プロセスにさらに決定論を追加できる可能性があります。Queue<T>Stack<T>

public int SendMultipleMessages(Queue<Message> messages)
{
  while (messages.Count > 0)
  {
     var message = messages.Dequeue();
     // do something with message, and once you're done it is
     // probably eligible for garbage collection because it is
     // no longer in the Queue
  }

  Task.Factory.StartNew(() =>
        {
            //very time demanding task
            _sendRequestHandler.SendMultipleMessages(BatchId);
        });

 return BatchId;
}
于 2013-03-04T16:25:19.713 に答える
1

GC に自分自身を管理させてください。使用可能なリソースなどに応じて、マシンごとに異なる方法で最適化されます。自分で呼び出して行うことは、アプリケーションのパフォーマンスを損なうことだけです。

于 2013-03-04T16:24:16.793 に答える