我有一个由多个电台消耗的Windows服务。当服务启动时,我想完成pre_process
任务而不是开始我的线程。
public class XML_Processor : ServiceBase
{
Thread worker;
bool running;
public bool Start()
{
pre_process();// add files to queue, please ensure it completes first.
bool success = true;
running = true;
worker = new Thread(new ThreadStart(ServiceLoop));
worker.Start();
return (success);
}
public bool Stop()
{
// blah
}
public void ServiceLoop()
{
string fileName;
while (running)
{
// blah
我对我的代码不自信,我认为该线程可以在pre_process()方法之前启动。 谢谢你的意见。
答案 0 :(得分:1)
如果您对流程中当前正在运行的线程有任何歧义,您可以随时测试当前线程的数量,以便您可以启动服务 only 当主线程处于活动状态而没有任何其他生成的运行线程时:
while(Process.GetCurrentProcess().Threads > 1);
worker.Start();
答案 1 :(得分:1)
如果您想确定PreProcess
方法是否已完成,请使用AutoResetEvent
表示正在执行的Thread
继续。
private bool _running;
private Thread worker;
private readonly AutoResetEvent _resetEvent = new AutoResetEvent(false);
public bool Start()
{
// Make sure the reset event is in not signalled state
_resetEvent.Reset();
// Do you pre processing
PreProcess();
_running = true;
worker = new Thread(ServiceLoop);
worker.Start();
return _running;
}
在您的PreProcess
方法中,您只需以信号
private void PreProcess()
{
// Do pre processing stuff
_resetEvent.Set();
}
您的ServiceLoop
“等待”,直到您的PreProcess
方法信号开始
public void ServiceLoop()
{
// Guaranteed nothing else will be executed until
// the reset event is signalled
_resetEvent.WaitOne();
while (_running) { /* .. */ }
}
答案 2 :(得分:0)
是pre_process();
同步操作还是异步操作?
您需要确保pre_process();
方法的所有调用都是同步的。
如果是这样,该方法也是同步的,它将在完成后返回。如果有异步操作,你必须等待那些完成。