Как сделать функцию задержки по времени на 5 секунд - PullRequest
0 голосов
/ 23 ноября 2011

Я пытаюсь перевести это на 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 ]

6 голосов
/ 23 ноября 2011

Используйте Thread.Sleep(5000), чтобы приостановить поток на 5 секунд вместо вашего кода - в нем есть несколько логических ошибок.

present будет значением DateTime.Now при выполнении этой строки, а add30Seconds будет значением DateTime.Now плюс 5 секунд при этой строке .

Эти переменные не будут обновлять и не будут изменять их значения.

Это означает, что present будет никогда будет == до add30Seconds.

1 голос
/ 23 ноября 2011

Я думаю, что выше ответ имеет недостаток, он вешает основной поток, в большинстве случаев это опасно.Вы должны запустить новый поток для этой задачи задержки, в потоке proc, спать 30 секунд, а затем выполнить работу во втором потоке.

0 голосов
/ 21 октября 2016

добавить к началу кода:

с использованием

System.Threading;                // allows use of sleep time

В вашем коде вставьте:

Thread.Sleep(5000);             // Pause 5 seconds, where you need, delay 5 seconds
0 голосов
/ 18 ноября 2012

Вы также можете использовать этот код:

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;
0 голосов
/ 23 ноября 2011

На самом деле в вашем коде нет ничего , ожидающего .Вы немедленно выполняете проверку, и она всегда будет правдой.На самом деле, если вам не повезет, вы почти никогда не достигнете этого точного времени.

Вы можете использовать таймер с этим.

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

ПРИМЕЧАНИЕ Естьнет проверки ошибок, если дебет зависает или время ожидания истекло.

0 голосов
/ 23 ноября 2011

ТАК ваше требование это подождать 30 секунд, а затем дебетовать? Если так, посмотрите на класс Timer. Вы можете установить интервал в 30 секунд, а при срабатывании выполнить свое действие.

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

30 секунд, кажется, ужасно долго ждать? Это требование курсовой работы?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...