C#:后台更新-任务或线程

时间:2018-11-08 02:44:07

标签: c# multithreading task

我想每10分钟在后台检查一次应用更新

为此,我应该使用最佳的什么?

  1. 异步调用void任务?
  2. 创建新线程?或
  3. Task.Run()

时间的精确性不是必需的

2 个答案:

答案 0 :(得分:2)

我会使用System.Threading.Timer。您可以使用需要一个TimeSpan的Change方法来使它每10分钟触发一次。使用计时器的优点是,您不会创建一个线程,而该线程在大多数时间都处于睡眠状态,因此效率低下。计时器已在操作系统中注册,并且在等待超时时,没有资源在使用中。

请注意,它是可重入的,因此,如果您的代码花费了10分钟以上,它可以在另一个线程上再次开始运行。

使用此解决方案无需担心线程本身,因为Timer将占用一个ThreadPool线程并对该线程运行回调。回到我对您的代码花费超过10分钟的评论中,如果您的回调在10分钟后仍在运行,则将使用ANOTHER线程池线程来运行您的计时器,因此在这种情况下,两个线程将同时运行您的回调。

使用Task并不一定意味着您的代码将在另一个线程中运行;它可以,但是由调度程序决定是否值得将其放入另一个线程。您仍然可以在Timer回调中使用Task;如果您的任务是IO绑定的,则可能要执行此操作,因为当您最终等待任务时,线程池线程将被释放以做其他将请求放入池中的工作。当您的任务完成时,它将获得另一个(可能不同)的线程来继续运行您的计时器回调代码。您可以在其他答案中找到有关任务如何工作的更多详细信息。

答案 1 :(得分:0)

您可以使用Quartz.Net库。这是一个工作计划库,您可以将其集成到应用程序中,并将按照您使用CRON设置的计划执行工作。 Quartz使用线程池外的线程来执行您的作业并为您管理这些作业。它是开源的,并且有很好的文档。

我将在此处保留链接:{{3}}

相关问题