C# 我怎样才能做一个5秒停顿的无限循环

C# 我怎样才能做一个5秒停顿的无限循环,c#,multithreading,loops,C#,Multithreading,Loops,如何使此循环在5秒内运行一次,直到停止。最简单的方法是: string connectionstring = "server =SQLVS2\\SQLVS2;database=DDM;Persist Security Info=True;uid=ddmuser;password=User02+Ddm;"; SqlConnection myConnection = new SqlConnection(connectionstring); SqlCommand myComma

如何使此循环在5秒内运行一次,直到停止。

最简单的方法是:

    string connectionstring = "server =SQLVS2\\SQLVS2;database=DDM;Persist Security Info=True;uid=ddmuser;password=User02+Ddm;";
    SqlConnection myConnection = new SqlConnection(connectionstring);
    SqlCommand myCommand = new SqlCommand("GetNullHash", myConnection);
    myCommand.CommandType = CommandType.StoredProcedure;
    myConnection.Open();
    SqlDataReader rdr = myCommand.ExecuteReader();

   while (rdr.Read())
    {
        string filename = @"\\" + rdr.GetString(3);
        filename = System.IO.Path.Combine(filename, rdr.GetString(2));
        filename = System.IO.Path.Combine(filename, rdr.GetString(1));
        computeHashh1 abc = new computeHashh1();
        Console.WriteLine(abc.computeHash(filename));          
        inserthash insert = new inserthash();
       insert.InsertHash(rdr.GetString(1), abc.computeHash(filename), rdr.GetStr(2),rdr.GetString(3));

    }
但是,为了更加健壮,我建议使用。

试试:

while (true) {
    // code here
    Thread.Sleep(5000);
}

这是最简单的。

我将包装您的代码并使用一个计时器对象,它将允许您控制计时器本身(停止、启动等)

更多信息请访问


好吧,如果我要这样做,并且间隔的限制不精确,我想绝对确保,如果我的代码偶尔花费的时间超过间隔,多个计时器事件将不会导致代码重新输入,我只会使用sleep()循环并让事情在没有任何额外计时器的情况下工作,这些计时器只会给看似简单的需求增加复杂性

在必须处理消息的GUI线程(或必须处理启动/停止等的主服务线程)之外,计时器通常不合适、笨拙,或者,如果另一个线程/池必须引发计时器事件,则浪费上下文切换


无论如何,在Vista/W7上,停止一个产生了睡眠线程的服务是没有问题的。操作系统需要大约20秒的时间才能意识到,即使服务主线程已经处理了停止消息,服务进程仍然有阻塞的线程——然后它无论如何都会终止服务进程,杀死所有睡眠/运行/等待/任何线程

如何在windows服务中编写正确的计时器?我实际上正在使用windows服务,但没有计时器查看我在
正确计时器上的链接。在这两种情况下,都是通过停止服务。怎么可能对sleep()循环缺乏健壮性?它不需要启动任何额外的计时器线程或线程池计时器任务,因此消除了两个上下文切换。@MartinJames:直到上面的第一条评论我才知道OP有一个windows服务。我假设是一个控制台应用程序/windows窗体应用程序,并将其与windows服务进行比较。windows服务更强大,因为如果您将其设置为自动启动,每次重新启动时它都会重新启动。为什么计时器是更好的方法?请参见此-有一个很好的解释。参考文献与此无关。OP不是不断地创建线程,只是在服务中启动的一个线程上循环。我要求任何人找到一个比sleep()更高效、CPU更明智、不需要其他线程运行、不需要消息处理循环(如果您出于任何其他原因不需要这些循环,那么实现起来会很混乱)的计时器替代品,它可以在任何线程、任何函数中随时工作,无论嵌套在线程代码中的深度有多深。我同意OP想要什么,你肯定是对的。为什么有人需要停止/启动无限循环的计时器?OP:我如何让这个循环在5秒内永远运行一次,或者直到停止。“5秒永远”-很简单或者直到停止”-相当简单:任务管理器/服务/停止服务。
while(true) 
{
    try 
    {
       thread.sleep(5000) 
    } 
    catch(Exception e) 
    {
      //handle the exception 
    }
}
System.Timers.Timer aTimer;
aTimer = new System.Timers.Timer();
aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
aTimer.Interval = 2000;
aTimer.Enabled = true;

private void OnTimedEvent(object source, ElapsedEventArgs e)
{
    //your code
}