Disposer correctement de la classe thread

J'ai une assez complexe multi-thread service Windows de travail, mais je ne peux pas comprendre comment le nettoyer correctement. Ci-dessous est une [pseudo] code de montrer ce que j'ai. Le code est beaucoup plus complexe, sans doute trop de copier/coller ici.

En gros, j'ai une Demande de classe qui crée un thread pour faire le travail. Lorsqu'une nouvelle demande arrive dans le port d'écoute, il l'envoie au Processeur, ce qui crée la Demande et maintient la liste des demandes. Si le service est arrêté, je le nettoyage de toutes les demandes dans la liste. Mais lorsque la Demande de travail qui est fait, comment dois-je nettoyer qu'une instance de la classe?

Merci pour toute aide!

Nelson

class Service
{
  Listener listener;
  Processor processor;

  OnStart()
  {
    processor = new Processor();
    listener = new Listener(processor);
  }

  OnStop()
  {
    listener.Dispose();
    processor.Dispose();
  }
}

class Listener
{
  Thread thread;
  bool terminate = false;

  Listener(Processor processor)
  {
    thread = new Thread(DoWork);
    thread.Start(processor);
  }

  DoWork(Processor processor)
  {
    WaitForConnection(NewConnection);
  }

 NewConnection(String data)
 {
    processor.NewRequest(data);

    if (terminate)
      return;

   WaitForConnection(NewConnection);
 }

  Dispose()
  {
    terminate = true;
    thread.Join();
  }
}

class Processor
{
  //I need to maintain this list so that when the service stops I can cleanly close down
  List<Request> requests = new List<Request>();

  NewRequest(string data)
  {
    request.Add(new Request(data));
  }

  Dispose()
  {
    //Cleanup each request
    foreach (Request request in requests)
    {
      request.Dispose();
    }
  }
}

class Request
{
  Thread thread;
  bool terminate;

  Request(string data)
  {
    while (true)
    {
      //Do some work
      Thread.Sleep(1000);

      if (doneWorking)
        break;

      if (terminate)
        return;
    }

    //We're done.  If I return this thread stops.  But how do I properly remove this Request instance from the Processor.requests list?
  }

  Dispose()
  {
    terminate = true;
    thread.Join();
  }
}

OriginalL'auteur Nelson Rothermel | 2009-09-22