7
    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

4 回答 4

18

最简单的方法是:

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

但是,为了更稳健,我会推荐一个带有适当计时器的Windows 服务

于 2012-07-24T13:55:03.770 回答
6

尝试:

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

它是最简单的。

于 2012-07-24T13:57:49.890 回答
6

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

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

于 2012-07-24T14:01:50.637 回答
0

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

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

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

于 2012-07-24T14:59:08.833 回答