Картинка блога

В JavaScript уже давно есть глобальная функция setTimeout. В полном .NET (например Windows Forms) для этих-же целей можно использовать таймер (Threading.Timer) с настройкой без повторений. А вот для SilverLight такой метод реализовать почему-то забыли, хотя именно в интерфейсе пользователя он необходим больше всего.
Примеров можно придумать массу. Первое что приходит в голову — отложенное выполнение запроса для авто заполнения. Чтобы не слать на сервер каждую букву, а делать это только после того, как пользователь перестал вводить текст.

DispatcherTimeout это статический класс с одним методом — Set:

public static class DispatcherTimeout
{
 private class DispatcherTimerContainingAction : DispatcherTimer
 {
 public Action<object> method { get; set; }
 public object state { get; set; }
 }

 private static void _onTimeout(object sender, EventArgs arg)
 {
 var t = sender as DispatcherTimerContainingAction;
 t.Stop();
 t.method(t.state);
 t.Tick -= _onTimeout;
 }

 public static void Set(Action<object> func, object state, long timeout)
 {
 var timer = new DispatcherTimerContainingAction
 {
 Interval = TimeSpan.FromMilliseconds(timeout),
 method = func,
 state = state
 };
 timer.Tick += _onTimeout;
 timer.Start();

 }
}

Использование приятно и просто:

int keyCounter = 0;
public void OnLetterArive(string text) {
 Interlocked.Increment(ref keyCounter);
 DispatcherTimeout.Set((txt) =>
 {
 Interlocked.Decrement(ref keyCounter);
 if(keyCounter==0)
 {
 //call service with 'txt parameter'
 }
 }, keyCounter, 600);
}

Метки:, , ,

2 комментария в “C#: Silverlight таймаут (Timeout)”

  1. Неверно исходть из соображение, что если есть функционал в «полном .NET», то это есть и в Silverlight. Тут действует обратная логика: а есть ли в SL то, что реализовано в «полном .NET»? Стандартный ответ: наверное есть, но реализовано по-своему.

  2. Да, это так. WPF и Silverlight используют общие классы и пространства имен, но техноголии разные. Наверно на это былы особые причины…