web-dev-qa-db-fra.com

Minuterie dans l'application UWP qui n'est pas liée à l'interface utilisateur

Je travaille sur un projet UWP MVVM et j'aimerais mettre en œuvre un système de déconnexion automatique si l'interaction utilisateur s'arrête pendant une durée spécifique.
Jusqu'à présent, j'utilise un DispatcherTimer pour compter à rebours à partir de 200 chaque seconde.

TimerLeave = 200;
var _dispatcherTimer = new DispatcherTimer();
_dispatcherTimer.Tick += dispatcherTimer_Tick;
_dispatcherTimer.Interval = new TimeSpan(0, 0, 1);

_dispatcherTimer.Start();

Mais parce que DispatcherTimer est lié à l'interface utilisateur et que je crée une application MVVM, je cherche une alternative.
J'ai cherché un peu et j'ai trouvé exécuter une tâche en arrière-plan sur une minuterie . Le problème est que cette minuterie ne peut être réglée pour s'exécuter toutes les 15 minutes, ce qui est un peu trop long pour déconnecter automatiquement un utilisateur dans mon cas. Je n'ai trouvé aucune solution de contournement pour réduire les 15 minutes.
Ma question est donc la suivante: existe-t-il une possibilité de configurer une minuterie dans un projet UWP qui n'est pas liée à l'interface utilisateur et qui puisse être définie comme variable?

15
croxy

Oui - vous pouvez par exemple utiliser classe Timer - mais vous devez vous rappeler qu'il s'exécute sur un thread séparé. Exemple:

private Timer timer;
public MainPage()
{        
    this.InitializeComponent();
    timer = new Timer(timerCallback, null, (int)TimeSpan.FromMinutes(1).TotalMilliseconds, Timeout.Infinite);
}

private async void timerCallback(object state)
{
    // do some work not connected with UI

    await Window.Current.CoreWindow.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal,
        () => {
            // do some work on UI here;
        });
}

Notez que le travail distribué sur le répartiteur d'interface utilisateur peut ne pas être traité immédiatement - cela dépend de la charge de travail du répartiteur.

N'oubliez pas non plus que cette minuterie fonctionne avec votre application et ne fonctionnera pas lorsque l'application est suspendue.

20
Romasz

J'ai résolu ce problème récemment en utilisant une classe ThreadPoolTimer .

ThreadPoolTimer timer = ThreadPoolTimer.CreatePeriodicTimer((t) =>
        {
            //do some work \ dispatch to UI thread as needed
        }, TimeSpan.FromMinutes(1));

À l'heure actuelle, je ne connais aucun avantage de cela par rapport à la solution Timer déjà publiée, mais elle a bien fonctionné.

10
Saxar

Vous avez peut-être raison de votre code, mais j'ai utilisé le minuteur threadpool au lieu du minuteur dispacher, après avoir consulté le blog ci-dessus.

Si je parle du niveau initial que j'utilisais le minuteur du répartiteur pour mon application, ce qui se passe réellement, il se bloque tous les 2 jours de veille continue. J'ai donc pensé à la minuterie de threadpool comme vous le faites référence dans ce blog, mais dans threadpool, elle s'est bloquée en seulement 5-6 heures.

Donc, selon mon expérience, je pense que le temporisateur de répartiteur est plus préférable que le temporisateur de pool de threads.

C'est juste mon expérience de l'utiliser.

0
siddharth