상당히 복잡한 멀티 스레드 Windows 서비스가 작동하지만 올바르게 정리하는 방법을 알 수 없습니다. 아래는 내가 가지고있는 것을 보여주는 몇 가지 [의사] 코드입니다. 실제 코드는 훨씬 복잡하고 복사/붙여 넣기에는 너무 많습니다.스레드를 사용하여 클래스를 올바르게 처리 함
기본적으로 작업을 수행 할 스레드를 만드는 클래스 요청이 있습니다. 리스너에 새 요청이 들어 오면 프로세서로 보내어 새 요청을 만들고 요청 목록을 유지 관리합니다. 서비스가 중지되면 목록의 모든 요청을 정리합니다. 그러나 요청 작업이 완료되면 클래스의 한 인스턴스를 정리하는 방법은 무엇입니까?
도움 주셔서 감사합니다.
넬슨
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();
}
}
그것은 기본적으로 내가 지금 가지고있는 것입니다. 확인해 주셔서 감사합니다. 왜 당신은 요청을합니까? 배열()? 잠금을 피할 수있을 정도입니까? 어떤 방식 으로든 더 빠르고 안전합니까? 감사. –
안전하고 성능이 좋습니다 ... 다른 스레드가 내 목록에서 제거하므로 잠글 수 없습니다. 목록을 잠그면 Join()이 완료되지 않습니다. 잠금이 설정된 상태에서 함수를 호출하지 않는 것이 가장 좋습니다. 또한 컬렉션이 수정되고 foreach 루프에서 예외가 발생하므로 잠금을 무시할 수 없습니다. –
코드의 다른 부분에서 직접 경험했습니다. 나는 그것이 교착 상태 때문에 발생했다는 것을 알았지 만, 당신 덕분에 쉽게 해결할 수있었습니다. –