【问题标题】:C#: Background updates - Task or ThreadC#:后台更新 - 任务或线程
【发布时间】:2018-11-08 02:44:06
【问题描述】:

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

我应该使用什么来优化?

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

时间精度不是必须的

【问题讨论】:

    标签: c# multithreading task


    【解决方案1】:

    我会使用System.Threading.Timer。您可以使用 Change 方法,该方法需要 TimeSpan 使其每 10 分钟触发一次。使用计时器的优点是您不会创建一个大部分时间都在休眠的线程,这是低效的。计时器已向操作系统注册,在等待超时时,没有使用任何资源。

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

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

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

    【讨论】:

    • 不错。您可能想补充一点,计时器通常不会对正在运行的线程数产生任何影响,并且计时器比无所事事 10 分钟的线程要好。 :)
    • @Andy 太棒了!我会用计时器!但仍然对什么更好的感兴趣 - 启动线程或任务?
    • @Andrew 空闲时,计时器可能根本不需要线程,如果需要,它将被多路复用。然而,启动一个除了Thread.Sleep(TimeSpan.FromMinutes(10)) 之外什么都不做的显式线程是非常低效的。 10分钟在事情的计划中是很长的时间。在此期间,昂贵的线程可能会做很多事情
    • @MickyD 谢谢!
    • @MickyD 我试着采纳你的反馈;让我知道你的想法。
    【解决方案2】:

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

    我将把链接留在这里:https://www.quartz-scheduler.net/

    【讨论】:

    猜你喜欢
    • 2020-11-07
    • 2014-04-18
    • 1970-01-01
    • 1970-01-01
    • 2012-06-09
    • 2014-09-02
    • 2014-05-28
    • 2012-10-03
    • 1970-01-01
    相关资源
    最近更新 更多