Je crée une application WPF qui appelle les services Web et affiche les données renvoyées par le service après avoir été décomposées et analysées par mon application. Le problème auquel je fais face est avec le multithreading. L'un des appels API est effectué à l'aide d'un DispatcherTimer toutes les 60 secondes. Le problème est que lorsque cet événement se déclenche, il bloque le thread d'interface utilisateur. J'ai essayé (de toutes les façons que je peux penser) pour mettre à jour l'interface utilisateur à partir du thread d'arrière-plan en utilisant les objets BackgroundWorker et Dispatcher (également délégués) et je ne peux pas comprendre cela. J'ai besoin d'un exemple montrant une étiquette sur le thread de l'interface utilisateur mis à jour par le thread d'arrière-plan. Toute aide avec ce serait fantastique car je suis sur le point de paniquer :).WPF Multithreading
J'ai regardé les autres articles et cela ne me donne pas beaucoup de sens. S'il vous plaît, portez-moi car je suis assez nouveau à ce sujet. Voici un exemple de ce que je voudrais faire. J'ai une étiquette sur la fenêtre nommée lblCase. J'appelle pullData() toutes les 60 secondes et je veux mettre à jour lblCase avec les données retournées sans bloquer l'interface utilisateur.
private void pullData()
{
//API call goes here...
lblCase.Content = iCase;
}
public MainWindow()
{
InitializeComponent();
DispatcherTimer timer = new DispatcherTimer();
timer.Tick += new EventHandler(timer_Tick);
timer.Interval = new TimeSpan(0,0,60);
timer.Start();
}
private void timer_Tick(object sender, EventArgs e)
{
pullData();
}
Un autre échantillon (la mienne) qui fait bien la même chose: http://stackoverflow.com/questions/ 1794402/asynchronous-waiting-while-c-function-is-execution/1794947 # 1794947 Le code de Ian est un peu mieux cependant ;-) Le seul commentaire que je ferais est que l'utilisation de la capture de variables dans les délégués anonymes peut être un peu d'esprit penché quand vous le voyez pour la première fois. Pour rendre le code un peu plus évident, je ferais de "worker" un membre de la classe MainWindow. – donovan
bon point, donovan et merci pour les gentils mots :) – kiwipom
Merci pour les réponses, messieurs. Je vais commencer à tester ces suggestions sous peu et vous ferai savoir ce qui fonctionne pour moi. – Joe