如何在5秒暂停时进行无限循环

时间:2012-07-24 13:54:26

标签: c# multithreading loops

    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));

    }

如何让这个循环在5秒内运行一次或直到停止。

4 个答案:

答案 0 :(得分:15)

最简单的方法是:

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

但是,为了更加健壮,我建议windows service使用proper timer

答案 1 :(得分:5)

尝试:

while(true) 
{
    try 
    {
       thread.sleep(5000) 
    } 
    catch(Exception e) 
    {
      //handle the exception 
    }
}

最简单。

答案 2 :(得分:5)

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

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
}

的更多信息

http://msdn.microsoft.com/en-us/library/system.timers.timer%28v=vs.100%29.aspx

答案 3 :(得分:0)

好吧,如果我要这样做,并且对间隔的约束不准确,我想绝对确定多个定时器事件永远不会导致我的代码重新进入,如果我的代码偶尔花费的时间长于间隔,我只是使用一个sleep()循环,让事情没有任何无关的定时器,只会增加复杂性,这似乎是一个简单的要求。

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

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