У меня есть способ уведомить пользователя, если приложение готово или нет, в зависимости от состояния готовности нескольких зависимых компонентов.Этот метод может вызываться несколько раз из нескольких компонентов, и нет необходимости учитывать мгновенное сообщение (продолжающееся менее секунды).Метод должен запускаться в потоке пользовательского интерфейса при обновлении элементов пользовательского интерфейса.
Таким образом, проблема состоит в следующем: 1. Задержка выполнения метода на определенный интервал (в моем случае 1000 мс) и 2. Только выполнение.самый последний запрос в очереди и отменить остальные.
Вот моя реализация, которая работает, но мне интересно, есть ли более краткий / эффективный способ ее реализации.Кажется, много кода для того, что он делает.
private Timer _appReadyDelayTimer;
private readonly Stack<Tuple<bool, string>> _appReadyRequestStack = new Stack<Tuple<bool, string>>();
public override void ShowAppReady(bool visible, string message)
{
lock (_appReadyRequestStack)
{
_appReadyRequestStack.Push(new Tuple<bool, string>(visible, message));
if (_appReadyDelayTimer == null)
{
_appReadyDelayTimer = new Timer(o =>
{
Tuple<bool, string> latestRequest;
lock (_appReadyRequestStack)
{
if (_appReadyRequestStack.Count == 0) return;
latestRequest = _appReadyRequestStack.Pop();
_appReadyRequestStack.Clear();
}
Dispatcher.Invoke(new Action(() => SetApplicationReadyMessage(latestRequest.Item1, latestRequest.Item2)));
});
}
_appReadyDelayTimer.Change(1000, Timeout.Infinite);
}
}
private void SetApplicationReadyMessage(bool visible, string message)
{ // Implementation Details }