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 ?
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
}
Vous devez utiliser Timer
classe. Il y a plusieurs minuteries intégrées et cela dépend de l'exigence qui minuterie à utiliser.
Système.Minuterie.Minuterie: ceci est plus approprié pour l'accès mutlithreaded. Les Instances de cette minuterie sont threadsafe.
Système.Le filetage.Minuterie: les Instances de cette minuterie ne sont pas sécurisées.
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.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
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
.