如何使一个函数延迟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;
        }
    }

如何使一个函数延迟5秒

使用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