安排一个方法然后......只是等待(使用计时器和线程)
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。
问题缺少一些有助于真正理解问题性质的细节。但以上内容应涵盖可能适用于您的情况的各种情况。
我必须安排一个方法每 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。
问题缺少一些有助于真正理解问题性质的细节。但以上内容应涵盖可能适用于您的情况的各种情况。