Comment exécuter une méthode périodiquement à partir de l'application client WPF en utilisant threading ou timer [fermé]

je suis en train d'élaborer un WPF application client.Cette application envoie périodiquement des données à webservice. Lorsque l'utilisateur s'est connecté à l'application je veux lancer méthode particulière tous les 5 mts pour envoyer des données à .asmx service.

ma question Est de savoir si je dois utiliser le threading ou le timer.Cette exécution de méthode devrait se produire pendant que l'utilisateur interagit avec l'application. I. e sans bloquer L'interface utilisateur pendant l'exécution de cette méthode

Toutes les ressources à rechercher ?

10
demandé sur EL Yusubov 2013-01-12 22:36:17

3 réponses

je recommande le System.Threading.Tasks namespace utilisant le nouveau async/await mots-clés.

// The `onTick` method will be called periodically unless cancelled.
private static async Task RunPeriodicAsync(Action onTick,
                                           TimeSpan dueTime, 
                                           TimeSpan interval, 
                                           CancellationToken token)
{
  // Initial wait time before we begin the periodic loop.
  if(dueTime > TimeSpan.Zero)
    await Task.Delay(dueTime, token);

  // Repeat this loop until cancelled.
  while(!token.IsCancellationRequested)
  {
    // Call our onTick function.
    onTick?.Invoke();

    // Wait to repeat again.
    if(interval > TimeSpan.Zero)
      await Task.Delay(interval, token);       
  }
}

Ensuite vous suffit d'appeler cette méthode quelque part:

private void Initialize()
{
  var dueTime = TimeSpan.FromSeconds(5);
  var interval = TimeSpan.FromSeconds(5);

  // TODO: Add a CancellationTokenSource and supply the token here instead of None.
  RunPeriodicAsync(OnTick, dueTime, interval, CancellationToken.None);
}

private void OnTick()
{
  // TODO: Your code here
}
30
répondu Erik 2016-07-03 03:13:58

Vous devez utiliser Timer classe. Il y a plusieurs minuteries intégrées et cela dépend de l'exigence qui minuterie à utiliser.

  1. Système.Minuterie.Minuterie: ceci est plus approprié pour l'accès mutlithreaded. Les Instances de cette minuterie sont threadsafe.

  2. Système.Le filetage.Minuterie: les Instances de cette minuterie ne sont pas sécurisées.

  3. Système.Windows.Le filetage.DispatcherTimer -> Il envoie à Dispatcher thread (et n'est pas multithread). Ceci est utile si vous avez besoin de mettre à jour L'interface utilisateur.

  4. Système.Windows.Forme.Minuterie - > cette minuterie soulève des événements dans le thread de L'interface utilisateur. Ceci est optimisé pour les formulaires windows, et ne doit pas être utilisé dans WPF.

ce qui Suit est une lecture intéressante.

Comparaison de la Minuterie Classes dans le .NET Framework Bibliothèque de Classe

9
répondu Tilak 2013-01-12 18:48:54

si vous voulez que la méthode s'exécute sur un thread différent de celui de L'interface utilisateur, utilisez System.Threading.Timer. Sinon (mais je ne pense pas que ce soit votre cas), utilisez System.Windows.Threading.DispatcherTimer.

2
répondu Mir 2013-01-12 18:39:06