У меня работает довольно сложная многопоточная служба Windows, но я не могу понять, как правильно ее очистить. Ниже приведен некоторый [псевдо] код, чтобы показать, что у меня есть. Фактический код намного сложнее, возможно, его слишком много, чтобы скопировать / вставить здесь.
По сути, у меня есть класс Request, который создает поток для выполнения работы. Когда новый запрос поступает в прослушиватель, он отправляет его процессору, который создает новый запрос и поддерживает список запросов. Если служба остановлена, я очищаю все запросы в списке. Но когда работа с Запросом завершена, как мне очистить этот экземпляр класса?
Спасибо за любую помощь!
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();
}
}