0

我正在尝试将其翻译成 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;
        }
    }
4

6 回答 6

6

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

present将是该DateTime.Now行执行时的值,并且add30Seconds将是该DateTime.Now执行时加上 5 秒的值。

这些变量不会更新,也不会改变它们的值。

这意味着present永远不会==。_add30Seconds

于 2011-11-22T22:32:43.027 回答
1

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

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

30 秒的等待时间似乎很长?这是课程要求吗?

于 2011-11-22T22:32:32.737 回答
1

您的代码中实际上没有任何等待。您正在立即执行检查,并且它始终是正确的。事实上,除非你非常幸运,否则你几乎永远不会达到那个准确的时间。

你可以用这个计时器。

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

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

于 2011-11-22T22:36:08.333 回答
1

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

于 2011-11-22T23:05:46.067 回答
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;
于 2012-11-18T13:40:10.793 回答
0

添加到代码的开头:

使用

System.Threading;                // allows use of sleep time

在您的代码中插入:

Thread.Sleep(5000);             // Pause 5 seconds, where you need, delay 5 seconds
于 2016-10-21T17:56:28.697 回答