安排一个方法然后......只是等待(使用计时器和线程)

Schedule a method and... just wait (with a timer and threads)

我必须安排一个方法每 X 分钟执行一次。我的方法是将它安排在一个单独的线程中,带有一个计时器,然后离开主线程...等待 :)

    static void Main(string[] args)
    {
        ScheduleMyProcessEveryXMinutes(5);
        
        //wait
    }
    
    private void ScheduleMyProcessEveryXMinutes(int minutes)
    {
        var startTimeSpan = TimeSpan.Zero;
        var periodTimeSpan = TimeSpan.FromMinutes(minutes);

        var timer = new System.Threading.Timer((e) =>
        {
            MyProcess();
        }, null, startTimeSpan, periodTimeSpan);
    }
    
    private void MyProcess()
    {
        //Do my job
    }

离开主线程的最佳方式是什么'waiting',消耗最少的资源?我要运行后台程序

谢谢!

如果您不打算对主线程执行任何其他操作,那么为什么还要费心使用计时器呢?你的代码可以是这样的:

static void Main(string[] args)
{
    ScheduleMyProcessEveryXMinutes(5);
}
    
private void ScheduleMyProcessEveryXMinutes(int minutes)
{
    var periodTimeSpan = TimeSpan.FromMinutes(minutes);

    while (true)
    {
        MyProcess();
        Thread.Sleep(periodTimeSpan);
    }
}

如果您真的担心 在不需要时使用 线程(例如,您想消除 Thread.Sleep(),您可以执行上述操作,但是使用 async/await:

static async Task Main(string[] args)
{
    await ScheduleMyProcessEveryXMinutes(5);
}
    
private async Task ScheduleMyProcessEveryXMinutes(int minutes)
{
    var periodTimeSpan = TimeSpan.FromMinutes(minutes);

    while (true)
    {
        MyProcess();
        await Task.Delay(periodTimeSpan);
    }
}

如果出于某种原因你绝对必须按照你在问题中显示代码的方式来做,而你只是希望 Main() 方法不 return,你可以等待无限长时间:

static void Main(string[] args)
{
    ScheduleMyProcessEveryXMinutes(5);
    
    Thread.Sleep(System.Threading.Timeout.Infinite);
}

不过,如果您在最后一个示例中使用 ManualResetEvent 而不是 Thread.Sleep(),那么至少还有其他代码可以向 Main() 发出信号的方法方法实际唤醒并从方法中 return。

问题缺少一些有助于真正理解问题性质的细节。但以上内容应涵盖可能适用于您的情况的各种情况。