如何使函数timedelay减少5秒

时间:2011-11-22 22:29:08

标签: c# timedelay

我正在尝试将其转换为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;
        }
    }

6 个答案:

答案 0 :(得分:6)

使用Thread.Sleep(5000)暂停线程5秒钟而不是代码 - 它有几个逻辑错误。

执行该行时,

present将是DateTime.Now的值,add30Seconds将是DateTime.Now的值加上5秒行已执行。

这些变量不会更新,也不会更改其值。

这意味着present 永远不会<{1}}为==

答案 1 :(得分:1)

我认为上面的答案有缺陷,它挂起了主线程,在大多数情况下,它是危险的。 你应该为这个延迟任务启动一个新线程,在线程proc中,睡眠30秒,然后在第二个线程中完成工作。

答案 2 :(得分:0)

所以你要求它等待30秒然后借记?如果是这样,请查看Timer类。您可以将间隔设置为30秒,并在触发时执行操作。

http://www.dijksterhuis.org/using-timers-in-c/

虽然要等30秒,但30秒似乎确实很长时间了?这是课程作业吗?

答案 3 :(得分:0)

您的代码中实际上没有等待。你正在立即执行检查,它将永远是真的。事实上,除非你非常幸运,否则你几乎不会碰到那个确切的时间。

您可以使用计时器。

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

注意如果借记挂起或超时,则无错误检查。

答案 4 :(得分:0)

您也可以使用此代码:

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;

答案 5 :(得分:0)

添加到代码的开头:

使用

System.Threading;                // allows use of sleep time

在您的代码插入中:

Thread.Sleep(5000);             // Pause 5 seconds, where you need, delay 5 seconds