我正在尝试将其转换为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;
}
}
答案 0 :(得分:6)
使用Thread.Sleep(5000)
暂停线程5秒钟而不是代码 - 它有几个逻辑错误。
present
将是DateTime.Now
的值,时add30Seconds
将是DateTime.Now
的值加上5秒{ em>行已执行。
这些变量不会更新,也不会更改其值。
这意味着present
永远不会<{1}}为==
。
答案 1 :(得分:1)
我认为上面的答案有缺陷,它挂起了主线程,在大多数情况下,它是危险的。 你应该为这个延迟任务启动一个新线程,在线程proc中,睡眠30秒,然后在第二个线程中完成工作。
答案 2 :(得分:0)
所以你要求它等待30秒然后借记?如果是这样,请查看Timer类。您可以将间隔设置为30秒,并在触发时执行操作。
虽然要等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