Простой с использованием DispatcherTimer - не работает - PullRequest
0 голосов
/ 13 января 2012

У меня есть приложение, выполненное в WPF, использующее MvvM / Prism / Unity и Remote в качестве источника данных.

Мне нужна базовая вещь, которая в win-формах действительно проста, просто проверьте, простаивает ли приложение через несколько минут, а если не используется, заблокируйте приложение и покажите экран входа в систему.

После некоторых поисков в Google я нашел одно решение, которое использует DllImport, а другое - методы чистого Wpf.

Я не знаю, что после того, как я реализовал способ Wpf (пожалуйста, проверьте код ниже), он работает только после того, как я войду в приложение, если я открою и нажму в простом текстовом поле или нажму на поиск, метод ожидания не запускается, похоже, что на заднем плане висит что-то, что заставляет Wpf бездействовать и думать, что оно что-то делает, когда это не так.

Как я могу проверить все службы / методы / и т.д .., которые находятся в памяти, связанные с приложением may? Callstack не слишком много для меня. Я боюсь, что или я неправильно вызываю удаленные сервисы, или я внедрил что-то неправильно в реквизиты PropChanged events / observablecollections / etc ...

Есть ли лучший способ сделать это, используя 100% структуру Wpf?

private void CheckIdleTime()
{

    handler = delegate
    {
        DispatcherTimer timer = new DispatcherTimer();
        timer.Interval = TimeSpan.FromSeconds(5);
        timer.Tick += delegate
        {
            if (timer != null)
            {
                timer.Stop();
                timer = null;
                System.Windows.Interop.ComponentDispatcher.ThreadIdle -= handler;

                Console.WriteLine("IDLE! Lets logoff!");

                this.LockApplication();

                Console.WriteLine("logoff fired");

                System.Windows.Interop.ComponentDispatcher.ThreadIdle += handler;
            }

        };

        timer.Start();


        Dispatcher.CurrentDispatcher.Hooks.OperationPosted += delegate
        {
            if (timer != null)
            {
                timer.Stop();
                timer = null;
            }
        };
    };

    ComponentDispatcher.ThreadIdle += handler;
}

1 Ответ

1 голос
/ 13 января 2012

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

следующая ссылка поможет вам реализовать это ..

Application.Idle событие не запускается в приложении WPF

...