Каков наилучший способ инициировать обновление пользовательского интерфейса по истечении n секунд? - PullRequest
0 голосов
/ 18 декабря 2009

My C # WinForms UI имеет некоторые параметры, которые пользователь может настроить с помощью ползунков. Многие части пользовательского интерфейса могут интерактивно обновляться на основе значений ползунка. Однако для некоторых частей требуется более длительный расчет, который требует дополнительных затрат для настройки. Я хотел бы запустить этот процесс обновления только после того, как пользователь перестал двигать ползунки, скажем, в течение 2 секунд. Какой лучший способ сделать это?

Ответы [ 4 ]

2 голосов
/ 18 декабря 2009

Reactive Framework идеально подходит для этого. Если у вас есть C # 3.5, вы можете использовать его.

Observable.FromEvent<ScrollEventArgs>(vScrollBar1, "Scroll")
    .Throttle(TimeSpan.FromSeconds(2)) // Wait for two second alter all Scroll event ended
    .ObserveOnWindowsForms() // Make the lambda expression run on the UI thread
    .Subscribe(
        e =>
        {
            // Update your stuff
            labelControl1.Text = e.EventArgs.NewValue.ToString();
        });

Вы можете избавиться от вызова ObserveOnWindowsForms, если вы не хотите, чтобы ваш пользовательский интерфейс зависал во время работы lamda, но убедитесь, что вы правильно обращаетесь к своему компоненту пользовательского интерфейса, чтобы избежать исключения многопоточности.

1 голос
/ 18 декабря 2009

Вы можете использовать элемент управления Timer, который сбрасывает пользовательский интерфейс, если что-либо изменилось через 2 секунды.

Таймер также будет проверять переменную, помеченную после каждого изменения, поэтому пользовательский интерфейс обновляется только тогда, когда флаг не изменяется и время таймера истекает.

0 голосов
/ 18 декабря 2009

Вам необходимо использовать этот таймер: System.Windows.Forms.Timer . Зачем? Он выполняется в потоке пользовательского интерфейса, то есть вам не нужно использовать InvokeRequired или BeginInvoke для выполнения кода обновления вашего пользовательского интерфейса в потоке пользовательского интерфейса.

0 голосов
/ 18 декабря 2009

У меня был бы личный экземпляр экземпляра, ссылающийся на таймер потока. Когда таймер достигает 2 секунд, событие, содержащее вычисления, сработает. У всех ползунков будет прослушиватель изменений, который установит таймер на 0 и запустит таймер.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...