- Хроники. - -
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
Click here to print.
Copyright © 2008 Все, что меня окружает. All rights reserved.