Заинтересованы в обратной связи о My Timeout Class - PullRequest
3 голосов
/ 08 февраля 2011

Во многих областях проекта, над которым я работаю, есть простая проверка тайм-аута, которая в основном запускает код через цикл try до тех пор, пока он не завершится успешно или не пройдет 10 секунд.

class Timeout {
    private readonly DateTime timeoutDate;
    public bool FlagSuccess;

    public Timeout() {
        timeoutDate = DateTime.UtcNow.AddSeconds(10);
        flagSuccess = false;
    }

    public bool continueRunning() {
        if (!flagSuccess && DateTime.UtcNow < timeoutDate) return true;
        else return false;
    }
}

Вот пример используемого класса:

Timeout t = new Timeout();
while (t.continueRunning()) {
    try {
        //PUT CODE HERE
        t.flagSuccess = true;
    }
    catch(Exception e) {
        Console.WriteLine(e.Message);
    }
}

Прежде чем я это реализую, есть ли лучший и более стандартный способ сделать это?То, что я имею выше, основано на моей слепой интуиции.

Ответы [ 3 ]

4 голосов
/ 08 февраля 2011

Использовать .NET Timer класс (ы):

using System.Timers;

public static void Main() {
    Timer t = new Timer();
    t.Elapsed += new ElapsedEventHandler(ActionWhenFinished);
    t.Interval = 10000;
    t.Start();
}

public static void ActionWhenFinished()
{
    // cancel any action
}

Ваш класс Timeout заблокирует текущий поток, в котором он работает, что не имеет место с System.Timer.

0 голосов
/ 08 февраля 2011

Я бы предложил изменить ваш цикл на цикл do-while, чтобы вы гарантированно запускали цикл хотя бы один раз, даже если ваш поток на мгновение задерживается между установкой тайм-аута и запуском цикла.Кроме того, я бы предположил, что было бы полезно, чтобы класс Timeout включал свойство RemainingMilliseconds и, возможно, функцию RemainingMillisecondsUpTo (Integer N), которую можно было бы передать различным процедурам блокировки или тайм-аута.

0 голосов
/ 08 февраля 2011

Для меня это выглядит как занятый цикл, но вот как бы вы сделали это с помощью секундомера.

    System.Diagnostics.Stopwatch timer = new System.Diagnostics.Stopwatch();
    timer.Start();
    bool complete;
    while( timer.ElapsedMilliseconds < 10000 && !complete)
    {
        //Do stuff
       // and someday... complete = true;
    }

Вы можете также обернуть это в простой класс.

class AgingWait
{
 System.Diagnostics.Stopwatch _watch = new System.Diagnostics.Stopwatch();
 int maxMilliseconds;
 bool forceExpire;
 public bool Expired
 {
     get { return forceExpire || maxMilliseconds < _watch.ElapsedMilliseconds; }
 }
 public AgingWait(int milli)
 {
     _watch.Start();
     maxMilliseconds = milli;
 }

 public void Expire()
 {
     forceExpire = true;
 }
}

использовать

    AgingWait waiter = new AgingWait(1000);
    while (!waiter.Expired)
    {
        if (condition)
            waiter.Expire();

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