【发布时间】:2020-09-11 15:48:56
【问题描述】:
我试图让 2 个任务在特定时间点同时触发,然后重新执行。例如,下面是等待 1 分钟的任务和等待 5 分钟的第二个任务。 1 分钟任务应在 5 分钟内触发 5 次,5 分钟任务应在 1 次内触发,1 分钟任务应在 10 分钟内触发 10 次,5 分钟任务应在 2 次内触发,如此循环。但是,我需要 1 分钟的任务与 5 分钟的任务同时触发。
我可以使用 System.Timers 来做到这一点,但这与我最终需要的多线程处理效果不佳。 System.Thread 没有任何与 System.Timers AutoReset 等效的东西,除非我遗漏了什么。
我下面的内容是两个延迟计时器同时启动,但 t1 只触发 1 次而不是 5 次。本质上它需要继续运行,直到程序停止 X 次为止。
int i = 0;
while (i < 1)
{
Task t1 = Task.Run(async delegate
{
await Task.Delay(TimeSpan.FromMinutes(1));
TaskWorkers.OneMinuteTasks();
});
//t1.Wait();
Task t2 = Task.Run(async delegate
{
await Task.Delay(TimeSpan.FromMinutes(5));
TaskWorkers.FiveMinuteTasks();
});
t2.Wait();
}
更新 我首先阅读了下面的 Johns 评论,内容是为任务添加一个内部循环。下面按我的意愿工作。简单的修复。我知道我确实说过只要程序运行我就希望它运行,但我能够计算出我实际需要的最大循环数。 x
Task t1 = Task.Run(async delegate
{
for(int x = 0; x < 10; x++)
{
await Task.Delay(TimeSpan.FromMinutes(1));
TaskWorkers.OneMinuteTasks();
}
});
Task t2 = Task.Run(async delegate
{
for (int x = 0; x < 10; x++)
{
await Task.Delay(TimeSpan.FromMinutes(5));
TaskWorkers.FiveMinuteTasks();
}
});
据我所知,没有 CPU 或内存的总使用量。
【问题讨论】:
-
试试Hangfire
-
我重新打开了您的问题,因为 Servy's duplicate 与您的要求不符。如果 5 分钟的任务花费的时间超过 5 分钟会怎样?如果它应该是“尽可能每 5 分钟一次”,那么任务内部的一个简单循环就足够了。
标签: c# multithreading asynchronous task