确保方法在另一个方法调用之前完成

时间:2013-12-24 14:13:08

标签: c# multithreading

我有一个由多个电台消耗的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()方法之前启动。 谢谢你的意见。

3 个答案:

答案 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();方法的所有调用都是同步的。 如果是这样,该方法也是同步的,它将在完成后返回。如果有异步操作,你必须等待那些完成。