Правильное использование System.Threading.Timer - PullRequest
1 голос
/ 16 марта 2011

Я наткнулся на некоторый код, подобный приведенному ниже:

private void SomeCallBack(object state)
    {
        lock (_lock)
        {
            try
            {
                if (_timer == null)
                    return;

                _timer.Dispose();
                // do some work here
            }
            catch
            {
                // handle exception
            }
            finally
            {
                _timer = new Timer(SomeCallBack, state, 100, Timeout.Infinite);
            }
        }
    }

Я не понимаю цели воссоздания таймера каждый раз, когда выполняется обратный вызов. Я думаю, что код пытается достичь того, что только один поток может выполнять работу одновременно. Но разве блокировки не будет достаточно?

Также, согласно MSDN,

Обратите внимание, что обратные вызовы могут возникать после вызова перегрузки метода Dispose ()

Есть ли польза от этого? Если да, оправдывают ли преимущества затраты на утилизацию и создание таймера?

Спасибо за вашу помощь.

Ответы [ 2 ]

1 голос
/ 16 марта 2011

Кажется, что для кода требуется почти периодический таймер (не совсем периодический из-за дрожания, возникающего при обработке между истечением таймера и созданием нового таймера). Утилизация и воссоздание таймера действительно лишние затраты. Change метод будет лучше.

Проверка на ноль также любопытна; где-то еще должен быть код, который устанавливает _timer в ноль, чтобы он имел какой-либо эффект.

0 голосов
/ 23 мая 2013

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

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