我有一个带计时器的班级,如下所示

public class helper
{
    Timer timer = new Timer();
    private int counter = 0;
    private int returnCode = 0;


    public int Process()
    {
        SetTimer();
        Console.WriteLine("The application started ");
        return counter;

    }

    public void SetTimer()
    {
        int optionalWay = 0;
        // Create a timer with a two second interval.
        timer = new System.Timers.Timer(2000);
        // Hook up the Elapsed event for the timer.
        timer.Elapsed += (sender, e) => OnTimedEvent(sender, e, optionalWay);

        timer.AutoReset = true;
        timer.Enabled = true;

    }

    private void OnTimedEvent(Object source, ElapsedEventArgs e, int optionalWay)
    {
        counter++;
        Console.WriteLine("Timer is ticking");

        if (counter == 10)
        {
            timer.Stop();
            timer.Dispose();
            returnCode = returnCode + 1;
        }
    }
}


我下面有这样的主要功能

public static void Main()
{
    helper helper = new helper();
    int code = helper.Process();
    Console.WriteLine("Main " + code.ToString());
    Console.ReadLine();
}


我想做的是在计时器停止时而不是在此之前返回main

,我的计时器类运行正常,主要如下所示

所以main应该等到定时器的结果为1,然后结束进程

最佳答案

该代码可以正常工作。 helper.Process()函数内部没有任何东西可以等待或阻止执行,因此该函数会在甚至执行main之前立即返回到OnTimedEvent

解决方法可以通过在helper类中实现一个事件并在计时器完成其工作之后引发该事件来完成。 main可以监听该事件并采取相应的措施。

public class helper
{
    Timer timer = new Timer();
    private int counter = 0;
    private int returnCode = 0;

    public event EventHandler<int> Done;
    ...

    private void OnTimedEvent(Object source, ElapsedEventArgs e, int optionalWay)
    {
        counter++;
        Console.WriteLine("Timer is ticking");

        if (counter == 10)
        {
            timer.Stop();
            timer.Dispose();
            returnCode = returnCode + 1;

            if (Done != null)
            {
                Done.Invoke(this, returnCode);
            }
        }
    }
}


而在Program.cs

static void Main(string[] args)
{
    helper helper = new helper();
    helper.Done += helper_Done;
    helper.Process();
    Console.ReadLine();
}

static void helper_Done(object sender, int e)
{
    Console.WriteLine("Main " + e.ToString());
}


更新资料

Timer类使用ThreadPool中的新线程执行Elapsed事件处理程序。因此,它无法返回在其他线程上运行的Main。简而言之:使用计时器无法实现您想做的事情。

这是使用Thread.Sleep()的另一种解决方案,它将满足您的要求,但是请记住不要使用Thread.Sleep(),因为这样不建议这样做。

public class helper
{
    private int counter = 0;
    private int returnCode = 0;

    public int Process()
    {
        Console.WriteLine("The application started ");
        StartTimer(2000);
        return returnCode;
    }

    private void StartTimer(int ms)
    {
        while (counter++ < 10)
        {
            System.Threading.Thread.Sleep(ms);
            Console.WriteLine("Timer is ticking");
        }
        returnCode = returnCode + 1;
    }
}

class Program
{
    static void Main(string[] args)
    {
        helper helper = new helper();
        int code = helper.Process();
        Console.WriteLine("Main " + code.ToString());
        Console.ReadLine();
    }
}


同样,将Thread.Sleep用于延迟执行也不是一个好习惯,并且Thread.SleepTimer.Elapsed相比准确度较低。尝试更改应用程序的设计并使用事件或回调函数。

关于c# - 当计时器从C#控制台应用程序中的其他类停止时如何返回main,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48889113/

10-17 00:16