Nawet jeśli takie zjawisko w naszej aplikacji nie występuje, a może się zdarzyć, warto wykorzystać taką klasę by uniknąć problemów z czasem reakcji GUI.
Ja osobiście z tego modelu zrezygnowałem. Dlatego klasę utrwalam na blogu. Timer co 0.5s wystarcza w moim wypadku aż za nadto. Ponieważ wątki wykorzystują połączenia sieciowe real-time nie jest potrzebne.
public class RestrictedFrequencyAction
{
private TimeSpan m_update_delta;
private DateTime LastPerform;
private volatile bool m_scheduled;
private Object m_lock = new Object();
private volatile Action m_action;
public RestrictedFrequencyAction(int a_update_delta_ms)
{
m_update_delta = new TimeSpan(0, 0, 0, 0, a_update_delta_ms);
LastPerform = DateTime.Now - m_update_delta - m_update_delta;
}
public void Perform(Action a_action)
{
lock (m_lock)
{
int t = (int)(m_update_delta -
(DateTime.Now - LastPerform)).TotalMilliseconds;
if (t < 0)
{
LastPerform = DateTime.Now;
a_action();
}
else
{
m_action = a_action;
if (!m_scheduled)
{
m_scheduled = true;
new Task(() =>
{
Thread.Sleep(t);
lock (m_lock)
{
LastPerform = DateTime.Now;
m_scheduled = false;
m_action();
}
}).Start();
}
}
}
}
}
Brak komentarzy:
Prześlij komentarz