- Хроники. - -
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.