C# 什么时候使用,定时器和线程的区别是什么?

C# 什么时候使用,定时器和线程的区别是什么?,c#,multithreading,timer,C#,Multithreading,Timer,刚才对计时器和线程有一些混淆,请参见下面的示例,这两个代码都提供相同的结果(每60秒进行一次检查),所以当它们提供相同的结果时,我应该何时使用计时器,何时使用线程来处理作业 使用线程: Thread checkJob = new Thread(checkStatus); checkJob.Start(); protected void checkStatus() { //Do Checking here Thread.Sleep(60000); } 使用计时器: public F

刚才对计时器和线程有一些混淆,请参见下面的示例,这两个代码都提供相同的结果(每60秒进行一次检查),所以当它们提供相同的结果时,我应该何时使用计时器,何时使用线程来处理作业

使用线程:

Thread checkJob = new Thread(checkStatus);
checkJob.Start();

protected void checkStatus()
{
   //Do Checking here
   Thread.Sleep(60000);
}
使用计时器:

public Form1()
        {
            InitializeComponent();
            Timer time = new Timer();
            time.Interval = 60000;
            time.Tick += time_Tick;
            time.Enabled = true;
        }

      void time_Tick(object sender, EventArgs e)
            {
                //Do Checking here
            }

我建议使用定时器——它在资源消耗方面更合适。 建立一个新的线程是相当广泛的。
顺便说一句,如果您想使用Thread,您应该将其设置为IsBackground=true,以便它可以在应用程序关闭时完成其执行

您可以将线程视为“子进程”;一个进程可以有多个线程,允许它并行执行多个操作。线程是一种昂贵的系统资源;它在活动时使用CPU,并分配自己的调用堆栈(默认情况下为1MB)。使用线程执行周期性操作是对宝贵资源的浪费,并且不能很好地扩展


另一方面,计时器要便宜得多。它只是一个受时间控制的触发器,在大多数情况下,除了执行代码时,它什么也不做。在您的情况下,这是正确的选择。

这取决于您使用的计时器。如果您使用的是WinForms计时器,那么您的回调将在gui线程上触发。如果您有很多工作要做,那么这将导致您的应用程序阻塞,直到您完成为止,这将导致糟糕的用户体验

如果您使用的是其他计时器之一,那么它们将触发线程池中的一个线程。即使在这里,您也希望避免做太长的事情,但它不会阻塞您的gui线程。但是,您需要确保使用
BeginInvoke
方法将任何调用封送到gui中

如果每次定时器触发时都有长时间运行的任务要做,那么启动自己的线程是很好的,但是您还是希望将调用封送回gui线程。与其使用
Thread.Sleep
,不如使用
事件
,以便您可以检测系统的其余部分何时关闭:

ManualResetEvent stopEvent = new ManualResetEvent(false);
Thread checkJob = new Thread(checkStatus);
checkJob.Start();

protected void checkStatus()
{
   //Do Checking here
   while(stopEvent.Wait(60000) == false)
   {
     // Do processing
   }
}

现在,您可以通过调用
stopEvent.Set()

停止线程。如果定期执行的任务非常短,并且不会妨碍计时器运行的线程的处理,那么计时器是一个合理的选择


另一方面,如果周期性任务需要花费大量时间,并且您不能让主线程中断来执行它,那么单独的专用线程是一个不错的选择。

这完全取决于您正在做什么。这两个选项在不同的情况下都是不错的选择。在哪种情况下线程更好?与计时器相比,线程使用了额外的资源。我添加了一个简短的答案来解释设置一个新的线程,该线程将永远运行,并且一次睡眠60秒,这是不正确的expensive@User2012384,这个问题真的没有意义。。。他们太不一样了,不能做这种比较。他们只是没有相同的目的;就好像你在问锯子和锤子之间哪个更好;)