【发布时间】:2018-11-08 02:44:06
【问题描述】:
我想在后台每 10 分钟检查一次应用更新
我应该使用什么来优化?
- void 任务的异步调用?
- 创建新线程?或者
-
Task.Run()?
时间精度不是必须的
【问题讨论】:
标签: c# multithreading task
我想在后台每 10 分钟检查一次应用更新
我应该使用什么来优化?
Task.Run()? 时间精度不是必须的
【问题讨论】:
标签: c# multithreading task
我会使用System.Threading.Timer。您可以使用 Change 方法,该方法需要 TimeSpan 使其每 10 分钟触发一次。使用计时器的优点是您不会创建一个大部分时间都在休眠的线程,这是低效的。计时器已向操作系统注册,在等待超时时,没有使用任何资源。
请注意它是可重入的,因此如果您的代码花费超过 10 分钟,它可以在另一个线程上重新开始运行。
使用此解决方案无需担心自己的线程,因为 Timer 将采用 ThreadPool 线程并在其上运行您的回调。回到我关于您的代码花费超过 10 分钟的评论,如果您的回调在 10 分钟后仍在运行,则将采用另一个线程池线程来运行您的计时器,因此在这种情况下,两个线程将同时运行您的回调。
使用Task 并不一定意味着您的代码将在另一个线程中运行;它可以,但它取决于调度程序来确定它是否值得放入另一个线程。您仍然可以在 Timer 回调中使用 Task;如果您的任务是 IO 绑定的,您可能想要这样做,因为当您最终等待任务时,线程池线程将被释放来处理将请求放入池中的其他事情。当您的任务完成时,它将获得另一个(可能不同的)线程来继续运行您的计时器回调代码。您可以在其他答案中找到有关任务如何工作的更多详细信息。
【讨论】:
Thread.Sleep(TimeSpan.FromMinutes(10)) 之外什么都不做的显式线程是非常低效的。 10分钟在事情的计划中是很长的时间。在此期间,昂贵的线程可能会做很多事情
您可以使用 Quartz.Net 库。这是一个作业调度库,您可以将其集成到您的应用程序中,并将按照您使用 CRON 设置的时间表执行您的作业。 Quartz 使用线程池中的线程来执行你的工作并为你管理这些工作。它是开源的,并且有很好的文档。
我将把链接留在这里:https://www.quartz-scheduler.net/
【讨论】: