我有一个相当复杂的多线程Windows服务工作,但我无法弄清楚如何正确清理。下面是一些[伪]代码来显示我的。实际的代码要复杂得多,在这里复制/粘贴可能太多了。正确处理线程的类
基本上,我有一个类创建一个线程来完成这项工作的请求。当一个新的请求进入Listener时,它将它发送给处理器,处理器创建新的请求并维护请求列表。如果服务停止,我将清除列表中的所有请求。但是,当请求工作完成后,我该如何清理该类的一个实例?
感谢您的帮助!
尼尔森
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();
}
}
这基本上是我现在拥有的。感谢您的确认。为什么要做requests.ToArray()?是否可以避免锁定?以任何方式更快/更安全?谢谢。 – 2009-09-22 20:41:45
更安全,性能更好...锁定是不可能的,因为其他线程将从我的列表中删除它,如果我锁定列表,Join()永远不会完成。在锁定期间不要从功能中调出功能是一种最佳做法。此外,我不能简单地忽略该锁,因为该集合将被修改,并且我的foreach循环会得到一个异常。 – 2009-09-22 23:36:30
我在代码的另一部分获得了第一手的经验。我发现这是因为锁定()造成的,但是感谢你,我能够轻松解决它。 – 2009-09-28 21:16:40