当前位置:网站首页>Appel asynchrone, Multithreading

Appel asynchrone, Multithreading

2022-01-15 02:08:07 La lave de Rodinia

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading;

namespace Threading
{
    
    public partial class FrmTest : Form
    {
    
        public FrmTest()
        {
    
            InitializeComponent();
        }
        //Programmation synchrone
        private void btnTest1_Click(object sender, EventArgs e)
        {
    
            this.lblInfo1.Text = ExecuteTask1(10).ToString();
            this.lblInfo2.Text = ExecuteTask1(10).ToString();
        }

        private void btnTest2_Click(object sender, EventArgs e)
        {
    
            MyCalculator objMyCal = ExecuteTask1;

            //Appel asynchrone
            // Appel asynchrone de la méthode par délégation Calculator1
            //Type de délégationBegininvoke(< Variables d'entrée et de sortie >,AsyncCallbac callback,object asyncState)Méthodes: Le noyau de l'appel asynchrone  
            //Premier paramètre10, Représente l'argument de méthode correspondant au délégué .
            //Deuxième paramètrecallback,Fonction de rappel, Une fonction qui représente un appel automatique à la fin d'un appel asynchrone .
            //Troisième paramètreasyncState, Utilisé pour fournir des informations sur les paramètres pertinents à la fonction de rappel 
            //Valeur de retour:IAsyncResult --> Interface d'état de fonctionnement asynchrone , Paramètres encapsulés dans l'exécution asynchrone 
            //IAsyncResultMembres de l'interface:Voir le document d'aide
            IAsyncResult result = objMyCal.BeginInvoke(10,null,null);
            this.lblInfo1.Text = "Calcul en cours....";
            this.lblInfo2.Text = ExecuteTask2(200).ToString();

            int r = objMyCal.EndInvoke(result);
            //Type de délégationEndInvoke()Méthodes:AideIasynResultObjet d'interface, Toujours demander si l'appel asynchrone est terminé 
            // La méthode connaît tous les paramètres de l'appel asynchrone ,Alors..., Une fois l'appel asynchrone terminé , Extraire le résultat de l'appel asynchrone comme valeur de retour 
            this.lblInfo1.Text = r.ToString();
        }

        private int ExecuteTask1(int num)
        {
    
            Thread.Sleep(5000);
            return num*num;
        }
        private int ExecuteTask2(int num)
        {
    
            return num * num;
        }
        //1 Définir un délégué

        public delegate int MyCalculator(int num);
    }
}

Fonction de rappel pour Multithreading asynchrone

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading;

namespace _02_AsyncCallBackDemo
{
    
    public partial class FrmCalllBack : Form
    {
    
        public FrmCalllBack()
        {
    
            InitializeComponent();
            //3.2  Initialisation des variables déléguées 
            //this.objMycal += ExecuteTask1;

            //UtiliserlambdaExpression
            this.objMycal += (int num,int ms) => {
     Thread.Sleep(ms); return num * num; };

        }
        //3  Créer une variable déléguée , Parce que la fonction asynchrone et la fonction de rappel doivent utiliser , Alors définissez la variable membre 
        MyCalculator objMycal = null;
        //4 Exécuter plusieurs tâches en même temps
        private void btnExec_Click(object sender, EventArgs e)
        {
    
            
            //MyCalculator objMycal = null;
            //objMycal += ExecuteTask1;
            //Publier la tâche
            for (int i = 0; i < 11; i++)
            {
    
                objMycal.BeginInvoke(10 * i, 1000 * i, MyCallBack, i);//Paramètres,Paramètres, AsynCallback,object @object
            }
        }
        //5 Fonction de rappel
        private void MyCallBack(IAsyncResult result)
        {
    
            int res = objMycal.EndInvoke(result);
            // Affichage asynchrone des résultats :result.AsyncState Le champ est utilisé pour encapsuler les paramètres personnalisés lors d'un rappel ,objectType
            Console.WriteLine("No{0} Les calculs sont :{1}",result.AsyncState.ToString(),res);
            //Dernier paramètrei Donnez le champ de la fonction de rappel AsynStateAffectation,  Si beaucoup de données peuvent être définies comme des classes ou des structures 
        }
        //2,  Définir la méthode selon la délégation 
        private int ExecuteTask1(int num, int ms)
        {
    
            Thread.Sleep(ms);
            return num * num;
        }
        //1, Déclaration de délégation
        public delegate int MyCalculator(int num, int ms);
    }
}
//Résumé de la programmation asynchrone:
//1.  La programmation asynchrone est une méthode de programmation basée sur la délégation .
//2.  Chaque méthode appelée asynchrone est exécutée dans un thread séparé .Donc,, Essentiellement un programme multithreadé ,Ou une sorte de“Version simplifiée”La technologie Multi - Threading.
//3.  Il est plus approprié de passer plus de temps en arrière - plan 《Tâches simples》, Et les tâches doivent être indépendantes les unes des autres , Il ne devrait pas y avoir de code dans la tâche pour accéder directement aux contrôles visuels .
//4.  Si les tâches d'arrière - plan doivent être exécutées dans un ordre précis , Ou vous devez accéder aux ressources partagées , La programmation asynchrone ne convient pas , Au lieu de cela, la technologie de développement Multithreading devrait être utilisée directement .

Multithreading par programmation asynchrone :

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading;

namespace Threading
{
    
    public partial class FrmTest : Form
    {
    
        public FrmTest()
        {
    
            InitializeComponent();
        }
        //Programmation synchrone
        private void btnTest1_Click(object sender, EventArgs e)
        {
    
            this.lblInfo1.Text = ExecuteTask1(10).ToString();
            this.lblInfo2.Text = ExecuteTask1(10).ToString();
        }

        private void btnTest2_Click(object sender, EventArgs e)
        {
    
            MyCalculator objMyCal = ExecuteTask1;

            //Appel asynchrone
            // Appel asynchrone de la méthode par délégation Calculator1
            //Type de délégationBegininvoke(< Variables d'entrée et de sortie >,AsyncCallbac callback,object asyncState)Méthodes: Le noyau de l'appel asynchrone  
            //Premier paramètre10, Représente l'argument de méthode correspondant au délégué .
            //Deuxième paramètrecallback,Fonction de rappel, Une fonction qui représente un appel automatique à la fin d'un appel asynchrone .
            //Troisième paramètreasyncState, Utilisé pour fournir des informations sur les paramètres pertinents à la fonction de rappel 
            //Valeur de retour:IAsyncResult --> Interface d'état de fonctionnement asynchrone , Paramètres encapsulés dans l'exécution asynchrone 
            //IAsyncResultMembres de l'interface:Voir le document d'aide
            IAsyncResult result = objMyCal.BeginInvoke(10,null,null);
            this.lblInfo1.Text = "Calcul en cours....";
            this.lblInfo2.Text = ExecuteTask2(200).ToString();

            int r = objMyCal.EndInvoke(result);
            //Type de délégationEndInvoke()Méthodes:AideIasynResultObjet d'interface, Toujours demander si l'appel asynchrone est terminé 
            // La méthode connaît tous les paramètres de l'appel asynchrone ,Alors..., Une fois l'appel asynchrone terminé , Extraire le résultat de l'appel asynchrone comme valeur de retour 
            this.lblInfo1.Text = r.ToString();
        }

        private int ExecuteTask1(int num)
        {
    
            Thread.Sleep(5000);
            return num*num;
        }
        private int ExecuteTask2(int num)
        {
    
            return num * num;
        }
        //1 Définir un délégué

        public delegate int MyCalculator(int num);
    }
}

版权声明
本文为[La lave de Rodinia]所创,转载请带上原文链接,感谢
https://chowdera.com/2022/01/202201080558307656.html

随机推荐