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秒内运行一次或直到停止。
答案 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秒才能意识到,即使服务主线程处理了停止消息,服务进程仍然阻塞了线程 - 然后它终止了服务进程,杀死了任何休眠/运行/等待/无论线程。