2016-03-06 3 views
0

У меня этот код позади в ASP.NET странице:Как правильно использовать объект Timer?

protected void LoadFile(object sender, EventArgs e) 
    { 
     try 
     { 
       Timer myTimer = new Timer(); 
       myTimer.Elapsed += new ElapsedEventHandler(RemoveFile); 
       myTimer.Interval = 60000; 
       myTimer.Start(); 
     } 
     catch (Exception) 
     { 
     } 
    } 

    private void RemoveFile(object source, ElapsedEventArgs e) 
    { 
      string path = UniquePath(); 
      File.Delete(path); 
    } 

Когда обработчик события LoadFile выпустили функция RemoveFile уволен после 60 секунд (как определено в этой строке myTimer.Interval = 60000), если LoadFile снова после того, как обожженного Через 40 секунд FireFile заработает через 20 секунд.

Мой вопрос заключается в том, как активировать функцию RemoveFile через 60 секунд после последнего вызова события hanlder ?

+0

'Если LoadFile снова выстрелил через 40 секунд, то RemoveFile сработает через 20 секунд.' - Вы имеете в виду, что 'RemoveFile' будет вызываться дважды в этот момент? (Через минуту после первого вызова, через 20 секунд после второго)? Или он будет называться только один раз ?. – Rob

+3

Пожалуйста, никогда не кодируйте 'catch (исключение)', не говоря уже о 'catch (Exception) {}'. Это плохая практика, которая скрывает ошибки. – Enigmativity

+0

@Rob Он будет вызываться только один раз – Michael

ответ

0

Может быть, вы могли бы использовать myTimer.Stop(); только после того, как Timer myTimer = new Timer();

0

Я хотел бы использовать Reactive Extensions от Microsoft (NuGet "Rx-Main") для этого. Код становится:

private SerialDisposable _serialDisposable = new SerialDisposable(); 

protected void LoadFile(object sender, EventArgs e) 
{ 
    _serialDisposable.Disposable = 
     Observable 
      .Interval(TimeSpan.FromSeconds(60.0)) 
      .Subscribe(n => 
      { 
       string path = UniquePath(); 
       File.Delete(path) 
      }); 
} 

Теперь, наблюдаемые как события и вызов .Subscribe, как присоединение к событию. Вызов .Subscribe возвращает IDisposable, который вы можете использовать для отсоединения от наблюдаемого, вызывая .Dispose(). Объект SerialDisposable представляет собой специальный одноразовый класс, предоставляемый Rx, который позволяет вам назначать новые расходные материалы и автоматически удалять любые ранее назначенные одноразовые предметы. Это автоматически сбрасывает таймер каждый раз, когда запускается LoadFile.

Это всего лишь одно использование Rx - у него есть так много других применений и очень мощный и заслуживающий изучения.

+0

Но LoadFile является обработчиком событий asp.net в asp.net. Поэтому, если я создам serialDisposable как переменную класса, он будет воссоздан в каждом обратном вызове. – Michael

+0

@Michael Вы можете поместить его в переменную сеанса. Или в статическом сборнике и загрузке/создайте '_serialDisposable' на основе вашей логики. – Rob

Смежные вопросы