如何使一个函数延迟5秒
本文关键字:延迟 5秒 函数 何使一 | 更新日期: 2023-09-27 18:15:23
我试着把它翻译成c#代码:
等待5秒,然后从银行账户扣款。
我有一种感觉,我很接近……但这行不通。我这样做对吗?
public override void Process(BankAccount b, decimal amount)
{
DateTime present = DateTime.Now;
DateTime addFiveSeconds = DateTime.Now.AddSeconds(5);
if (present != addFiveSeconds)
{
this.Status = TransactionStatus.Pending;
}
else
{
b.Debit(amount);
this.Status = TransactionStatus.Complete;
}
}
使用Thread.Sleep(5000)
来暂停一个线程5秒,而不是你的代码-它有几个逻辑错误。
present
为该行执行时DateTime.Now
的值,add30Seconds
为该行执行时DateTime.Now
加5秒的值。
这些变量不会更新并且不会改变它们的值。
这意味着present
将永远不会是==
到add30Seconds
。
我认为上面的答案有缺陷,它会挂起主线程,在大多数情况下,这是危险的。您应该为这个延迟任务启动一个新线程,在线程进程中,休眠30秒,然后在第二个线程中完成工作。
所以你的要求是等30秒然后借?如果是这样,请查看Timer类。您可以将间隔设置为30秒,并在触发时执行操作。
http://www.dijksterhuis.org/using-timers-in-c/30秒似乎是一个很长的等待时间?这是课程要求吗?
在您的代码中实际上没有等待。你立即执行了检查,它永远是正确的。事实上,除非你非常幸运,否则你几乎不可能达到那个精确的时间。
你可以使用计时器。
var completed = false;
var timer = new System.Timers.Timer(30 * 1000);
timer.Elapsed += (o,e) =>
{
b.Debit(amount);
completed = true;
this.Status = TransactionStatus.Complete;
};
timer.Start();
this.Status = TransactionStatus.Pending;
while (!completed) ;
注意如果借记挂起或超时,则没有错误检查
您也可以使用以下代码:
DateTime present = DateTime.Now;
DateTime addFiveSeconds = DateTime.Now.AddSeconds(10);
while (DateTime.Now.TimeOfDay.TotalSeconds <= addFiveSeconds.TimeOfDay.TotalSeconds)
{
this.Status = TransactionStatus.Pending;
}
b.Debit(amount);
this.Status = TransactionStatus.Complete;
添加到代码开始:
使用System.Threading; // allows use of sleep time
在代码中插入:
Thread.Sleep(5000); // Pause 5 seconds, where you need, delay 5 seconds