Share via


Astuce Silverlight : Utiliser les Threads en Silverlight - #S017

image

Les Threads sont utilisés pour lancer plusieurs travaux de manière concurrentielle dans la même application. Dans un ordinateur avec un seul processeur, les threads sont coupés et le processeur commutera le lancement des threads. Dans un ordinateur avec deux processeurs ou plus, les threads sont capables d’être lancés exactement au même moment, un sur chaque processeur.

Utiliser les threads dans votre application Silverlight peut améliorer les performances en augmentant le temps de réponse de votre application. Vous trouverez ci-dessous, comment faire pour utiliser les threads. Dans cet exemple j’ai :

  1. Ajouté trois TextBlocks dans Page.xaml. Chaque TextBlock sera mis à jour par un thread séparé.
  2. Ajouté un Button pour démarrer et arrêter les threads.
  3. Déclaré trois threads. Chaque thread mettra à jour leur propre TextBlock.
  4. Déclaré un conteur pour chaque thread qui affichera le nombre de fois que le thread sera lancé.
  5. Ajouté Sleep(100) pour chacun des threads. Vous devez faire une pause dans vos threads sinon l’application sera vérouillée.
  6. Appelé BeginInvoke sur chaque élément que je souhaite mettre à jour, ici nos TextBlock. Cet appel est nécessaire depuis que nous essayons de faire un changement sur un élément de l’interface utilisateur qui a été créé par un autre thread (le thread principal).
  7. Dans App.xaml.cs, nous définissons Page.Done = true dans l’événement Application_Exit. Avec cette méthode, les threads seront arrêtés lorsque le navigateur Web sera fermé.

Prévisualisation :

App.xaml:

 private void Application_Exit(object sender, EventArgs e)
 {
     ((Page)this.RootVisual).Done = true;            
 }

Page.xaml:

 <UserControl x:Class="Threading.Page"
     xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml" 
     Width="400" Height="300">
     <Grid x:Name="LayoutRoot" Background="Yellow">
         <Canvas Margin="50">
             <Button Click="Button_Click" Content="Toggle Threads"></Button>
             <TextBlock x:Name="Data1" Canvas.Top="50">Thread 1</TextBlock>
             <TextBlock x:Name="Data2" Canvas.Top="100">Thread 2</TextBlock>
             <TextBlock x:Name="Data3" Canvas.Top="150">Thread 3</TextBlock>
         </Canvas>
     </Grid>
 </UserControl>

Page.xaml.cs:

 using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Net;
 using System.Windows;
 using System.Windows.Controls;
 using System.Windows.Documents;
 using System.Windows.Input;
 using System.Windows.Media;
 using System.Windows.Media.Animation;
 using System.Windows.Shapes;
 using System.Threading;
  
 namespace Threading
 {
     public partial class Page : UserControl
     {
         private Thread _thread1;
         private Thread _thread2;
         private Thread _thread3;
  
         private static System.Windows.Controls.TextBlock _data1;
         private static System.Windows.Controls.TextBlock _data2;
         private static System.Windows.Controls.TextBlock _data3;
  
         private static int _count1 = 0;
         private static int _count2 = 0;
         private static int _count3 = 0;
  
         private static bool _done = true;
  
         public bool Done
         {
             get { return _done; }
             set { _done = value; }
         }
  
         public Page()
         {
             InitializeComponent();
             
             _data1 = Data1;
             _data2 = Data2;
             _data3 = Data3;
         }
  
         private void StartThreads()
         {
             _done = false;
  
             _thread1 = new Thread(DoThread1);
             _thread1.Start();
  
             _thread2 = new Thread(DoThread2);
             _thread2.Start();
  
             _thread3 = new Thread(DoThread3);
             _thread3.Start();      
         }
  
         public static void DoThread1()
         {
             while (!_done)
             {
                 _count1++;
                 _data1.Dispatcher.BeginInvoke(delegate()
                 {
                     _data1.Text = _count1.ToString();
                  
                 });
                 System.Threading.Thread.Sleep(100);
             }
         }
  
         public static void DoThread2()
         {
             while (!_done)
             {
                 _count2++;
                 _data2.Dispatcher.BeginInvoke(delegate()
                 {
                     _data2.Text = _count2.ToString();
                    
                 });
                 System.Threading.Thread.Sleep(100);
             }
         }
  
         public static void DoThread3()
         {
             while (!_done)
             {
                 _count3++;
                 _data3.Dispatcher.BeginInvoke(delegate()
                 {
                     _data3.Text = _count3.ToString();
                     
                 });
                 System.Threading.Thread.Sleep(100);
             }
         }
  
         private void Button_Click(object sender, RoutedEventArgs e)
         {
             if (false == _done)
                 _done = true;
             else
                 StartThreads();  
         }
  
     }
 }

Syndication : Mike Snow’s Weblog
Traduction autorisée par Mike Snow.