线程或定时器,每 x 分钟 运行 的最佳方法
Thread or Timer , The best way for running every x minute
我至少有 20 个线程,每个线程每 x 分钟执行一些操作。我这里的问题是我可以使用带间隔的计时器,我在他们的 ElapsedEventHandler 上注册了一个委托,并在该方法中我使用 Thread 或 Task 进行操作。顺便说一句,我可以轻松管理计时器的启动、停止和间隔
这是最好的方法吗?
在 .NET 中是否有任何其他解决方案或其他选择?
例如:
List<IpeTimer> Timers = new List<IpeTimer>();
Timers.Add(new IpeTimer(){ TimerName = "timer1" ,Timer = new System.Timers.Timer()});
Timers[0].Timer.Interval = 4000;
Timers[0].Timer.Elapsed += new ElapsedEventHandler(TimerEventProcessor1);
Timers[0].Timer.Start();
Timers.Add(new IpeTimer() { TimerName = "timer2", Timer = new System.Timers.Timer() });
Timers[1].Timer.Interval = 5000;
Timers[1].Timer.Elapsed += new ElapsedEventHandler(TimerEventProcessor2);
Timers[1].Timer.Start();
和
public static void TimerEventProcessor1(object sender, ElapsedEventArgs e)
{
Task t2 = new Task(() =>
{
Console.WriteLine("1");
}
, TaskCreationOptions.LongRunning);
t2.Start();
}
public static void TimerEventProcessor2(object sender, ElapsedEventArgs e)
{
Task t2 = new Task(() =>
{
Console.WriteLine("2");
}
, TaskCreationOptions.LongRunning);
t2.Start();
}
None 以上。
使用等待 Task.Delay
的异步方法(内部使用 Threading.Timer
)。这样,您等待的时间间隔将不取决于操作需要多长时间(即,如果计时器的时间间隔为 2 秒,但 运行 需要 1 秒,那么只有一秒钟没有操作 运行小号):
async Task DoSomething(CancellationToken token)
{
while (true)
{
// do something
await Task.Delay(1000, token);
}
}
我使用您的代码想出了这个解决方案。
public static CancellationToken Token { get; private set; }
public static void Cancel()
{
Token = new CancellationToken(true);
}
async static Task DoSomething(int interval)
{
while (true)
{
Console.WriteLine("1");
await Task.Delay(interval, Token);
}
}
private static void Main(string[] args)
{
DoSomething(1000);
Thread.Sleep(5000);
Cancel();
Console.ReadLine();
}
我至少有 20 个线程,每个线程每 x 分钟执行一些操作。我这里的问题是我可以使用带间隔的计时器,我在他们的 ElapsedEventHandler 上注册了一个委托,并在该方法中我使用 Thread 或 Task 进行操作。顺便说一句,我可以轻松管理计时器的启动、停止和间隔
这是最好的方法吗? 在 .NET 中是否有任何其他解决方案或其他选择?
例如:
List<IpeTimer> Timers = new List<IpeTimer>();
Timers.Add(new IpeTimer(){ TimerName = "timer1" ,Timer = new System.Timers.Timer()});
Timers[0].Timer.Interval = 4000;
Timers[0].Timer.Elapsed += new ElapsedEventHandler(TimerEventProcessor1);
Timers[0].Timer.Start();
Timers.Add(new IpeTimer() { TimerName = "timer2", Timer = new System.Timers.Timer() });
Timers[1].Timer.Interval = 5000;
Timers[1].Timer.Elapsed += new ElapsedEventHandler(TimerEventProcessor2);
Timers[1].Timer.Start();
和
public static void TimerEventProcessor1(object sender, ElapsedEventArgs e)
{
Task t2 = new Task(() =>
{
Console.WriteLine("1");
}
, TaskCreationOptions.LongRunning);
t2.Start();
}
public static void TimerEventProcessor2(object sender, ElapsedEventArgs e)
{
Task t2 = new Task(() =>
{
Console.WriteLine("2");
}
, TaskCreationOptions.LongRunning);
t2.Start();
}
None 以上。
使用等待 Task.Delay
的异步方法(内部使用 Threading.Timer
)。这样,您等待的时间间隔将不取决于操作需要多长时间(即,如果计时器的时间间隔为 2 秒,但 运行 需要 1 秒,那么只有一秒钟没有操作 运行小号):
async Task DoSomething(CancellationToken token)
{
while (true)
{
// do something
await Task.Delay(1000, token);
}
}
我使用您的代码想出了这个解决方案。
public static CancellationToken Token { get; private set; }
public static void Cancel()
{
Token = new CancellationToken(true);
}
async static Task DoSomething(int interval)
{
while (true)
{
Console.WriteLine("1");
await Task.Delay(interval, Token);
}
}
private static void Main(string[] args)
{
DoSomething(1000);
Thread.Sleep(5000);
Cancel();
Console.ReadLine();
}