Реализация времени ожидания c # - PullRequest
7 голосов
/ 16 февраля 2011

Плохо ли использовать такой цикл while?Может быть, лучше использовать секундомер, или, может быть, у этого решения есть некоторые подводные камни?

    public void DoWork()
    {
        //do some preparation
        DateTime startTime = DateTime.Now;
        int rowsCount = 0;
        int finalCount = getFinalCount();
        do
        {
            Thread.Sleep(1000);
            rowsCount = getRowsCount(); // gets rows count from database, rows are added by external app.
        } while (rowsCount < finalCount && DateTime.Now - startTime < TimeSpan.FromMinutes(10));

    }

Я видел эту статью Реализация общего тайм-аута C # , но его слишком сложно использовать в простых сценариях- вам нужно подумать о синхронизации потоков, правильно ли их прервать или нет и так далее.

Ответы [ 2 ]

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

Насколько я понимаю, вы хотите, чтобы ваш метод выполнял какую-то работу до тех пор, пока он не будет выполнен или пока не истечет какой-то период времени? Я бы использовал Stopwatch для этого и проверил бы прошедшее время в цикле:

void DoWork()
{
    // we'll stop after 10 minutes
    TimeSpan maxDuration = TimeSpan.FromMinutes(10);
    Stopwatch sw = Stopwatch.StartNew();
    DoneWithWork = false;

    while (sw.Elapsed < maxDuration && !DoneWithWork)
    {
        // do some work
        // if all the work is completed, set DoneWithWork to True
    }

    // Either we finished the work or we ran out of time.
}
1 голос
/ 16 февраля 2011

Лучше использовать класс System.Timers.Timer.

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