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

标签 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() 方法之前启动。 感谢您的意见。

最佳答案

如果您想确定您的 PreProcess 方法是否已完成,请使用 AutoResetEvent向正在执行的线程发出信号以继续。

    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) { /* .. */ }
    } 

关于c# - 确保方法在另一个方法调用之前完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20762400/

相关文章:

c# - 我如何每 30 秒运行一个脚本?

c# - 如何存储协议(protocol)/规范结构

android - 当另一个线程中的语句失败时恢复 android 首选项的值

c++ - poco ping 线程安全吗

ios - 等待要在下一次分派(dispatch)时执行的 block 如何成功?

c# - 如何在.NET/C#中获取查询结果的底层SQL类型?

c# - 使用 C# 代码将列表选项添加到 Pdfform

c# - 创建需求

c++ - 线程同步101

c - Pthreads:我的并行代码在达到一定数量后不会将线程传递到函数中