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

C#:后台更新-任务或线程,c#,multithreading,task,C#,Multithreading,Task,我想在后台每隔10分钟检查一次应用程序更新 我应该为此使用什么 void任务的异步调用 创建新线程?或 Task.Run() 时间上的精确性不是必需的我会使用。您可以使用更改方法,该方法需要一个时间间隔,以使其每10分钟触发一次。使用计时器的优点是,您不会创建一个线程,而该线程大部分时间都处于休眠状态,这是非常低效的。计时器已向操作系统注册,在等待超时时,未使用任何资源 请注意,它是可重入的,因此,如果您的代码需要10分钟以上的时间,它可以在另一个线程上再次开始运行 使用此解决方案,您自己不必担

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

我应该为此使用什么

  • void任务的异步调用
  • 创建新线程?或
  • Task.Run()
    时间上的精确性不是必需的

    我会使用。您可以使用更改方法,该方法需要一个时间间隔,以使其每10分钟触发一次。使用计时器的优点是,您不会创建一个线程,而该线程大部分时间都处于休眠状态,这是非常低效的。计时器已向操作系统注册,在等待超时时,未使用任何资源

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

    使用此解决方案,您自己不必担心线程,因为计时器将获取一个线程并在该线程上运行回调。回到我对代码耗时超过10分钟的评论,如果回调在10分钟后仍在运行,那么将使用另一个线程池线程来运行计时器,因此在这种情况下,两个线程将同时运行回调


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

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


    我只想在这里留下链接:

    Nice。您可能想补充一点,计时器通常不会对正在运行的线程的数量产生任何影响,而且计时器比线程无所事事地坐在那里10分钟要好。:)@安迪好极了!我会用定时器!但仍然对什么更好的启动线程或任务感兴趣?@Andrew空闲时,计时器可能根本不需要线程,如果它需要线程,它将被多路复用。但是,旋转一个只执行
    thread.Sleep(TimeSpan.frommines(10))
    的显式线程是非常低效的。按照计划,10分钟是很长的时间。昂贵的线程在未来可能会做很多事情interim@MickyD谢谢@MickyD我试着把你的反馈融入其中;请告诉我您的想法。您可能想说明为什么选择Quartz.net而不是Windows任务计划程序。