1

J'essaie de faire un chronomètre dans Xamarin Forms et je me demandais si je devais utiliser le thread d'interface utilisateur native ou Parallel Task Lib pour mettre à jour constamment l'étiquette de temps? J'ai essayé d'utiliser le PT Lib, mais je n'arrive pas à le mettre à jour mon label, ce qui me fait penser que je devrais utiliser Native Threading, mais je suis inquiet si je pouvais mettre à jour l'interface utilisateur en utilisant une dépendance un service. Existe-t-il une meilleure pratique pour constamment mettre à jour l'interface utilisateur tout en étant capable d'exécuter d'autres tâches telles que les clics sur les boutons? MISE À JOUR: J'ai obtenu ce code ci-dessous pour travailler, mais est-ce une bonne pratique? Je suis en train de mettre à jour l'étiquette de l'heure tout en continuant à appuyer sur les boutons.Bibliothèque de tâches Parellel vs Thread UI Xamarin.Forms lors de la mise à jour constante de l'interface utilisateur

Stopwatch sw = new StopWatch(); 
bool inRace = false; 
async void StartLapClick(object sender, System.EventArgs e) 
{ 

    if (!inRace) 
    { 
     inRace = true; 
     sw.Start(); 
     updateTimer(); 
    } 
} 

async void updateTimer() 
{ 

    await Task.Run(() => 
    { 
     while(inRace) 
     { 

      string slc = sw.Elapsed.ToString(); 
      Device.BeginInvokeOnMainThread(() => 
      { 
       timerLbl.Text = slc; 
      }); 
      Task.Delay(100).Wait(); 
     } 
    }); 
} 
+0

De quelle résolution avez-vous besoin sur votre chronomètre? Secondes ou sous-secondes? – ctacke

+0

@ctacke Je vais afficher le temps en minutes: seconds.miliseconds –

Répondre

0

Vous devez mettre à jour l'interface utilisateur à partir du thread d'interface utilisateur. Vous pourriez avoir une minuterie ou quelque chose en cours d'exécution en arrière-plan pour sortir des événements périodiquement pour être ramassés et transmis au fil de l'interface utilisateur. Même si vous avez fait cela, je ne sais pas que la bibliothèque de tâches parallèle est ce que vous voulez utiliser. C'est plus axé sur l'exécution de nombreuses tâches ... en parallèle.

+0

Je l'ai eu pour fonctionner avec les fonctions async et wait. Serait-ce la meilleure pratique? J'ai posté le code que j'ai eu à travailler –

+0

Ouais, cela devrait être ok, mais en général, vous devriez éviter de créer des méthodes async qui renvoient void. D'une part, si une exception se produisait dans UpdateTimer(), il n'y aurait aucun moyen de l'attraper. –

+0

Très bon point, je n'avais pas pensé à des erreurs dans la fonction. Merci pour l'aide! –

0

Essayez ceci:

Device.StartTimer(TimeSpan.FromSeconds(1.0),() => { 
    // Your code 
}; 
+0

Merci, mais mon promblem ne démarrait pas une minuterie, il mettait à jour l'étiquette de la minuterie sur mon xaml tout en étant capable de cliquer sur les boutons. –

1

Non, votre code a quelques problèmes (selon la Best Practices in Asynchronous Programming):

  • async void est mauvais - ce appellera votre méthode dans le feu et oublier la mode, vous ne pouvez même pas obtenir les erreurs à partir de là. Vous devez utiliser uniquement pour les gestionnaires d'événements comme StartLapClick, pas des méthodes réelles comme updateTimer

  • Task.Delay(100).Wait(); - Ne pas bloquer les tâches, utilisez await pour cette

  • remplacer toute la boucle while avec une minuterie simple, , et retirez l'Task.Delay appel

  • updateTimer(); - vous appelez la méthode async en mode synchrone, ce qui est également mauvais.