- Хроники. - -

C#: Silverlight таймаут (Timeout)

Posted By Ikutsin On 8 марта 2011 @ 10:01 In .NET C# | Comments Disabled

[1]В 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);
}

Article printed from Хроники.:

URL to article: /1999-c-silverlight-tajmaut-timeout

URLs in this post:

[1] Image: /wp-content/uploads/2011/03/timeout.jpg

Copyright © 2008 Все, что меня окружает. All rights reserved.