dotnet cocoa modifier UI depuis un thread secondaire ?

Gilbert Tordeur 146 Points de réputation
2024-01-26T14:40:10.18+00:00

Bonjour.
J'écris une application cocoa en C# avec Visual Studio for Mac 17.6.3. Certaines méthodes effectuent de longs calculs, et j'aimerais afficher l'avancement de ces calculs. Je trouve plusieurs solutions sur Internet, mais qui s'appliquent à VDS pour Windows. Par exemple :

private void btnUpdate_Click(object sender, EventArgs e)
{
    Task.Run(() =>
    {
        string text = "Updated from another thread";
        this.Invoke((MethodInvoker)delegate
        {
            labelResult.Text = text;
        });
    });
}

Problème : MethodInvoker n'est pas reconnu (nom de type introuvable). Quelqu'un pourrait-il me donner le petit bout de code qui fait ça correctement ? Merci d'avance.

C#
C#
Langage de programmation orienté objet et sécurisé au niveau des types, qui prend ses racines dans la famille des langages C et inclut la prise en charge de la programmation orientée vers les composants.
10 questions
{count} votes

Réponse acceptée
  1. Omar Kefi (Convergys Corporation) 340 Points de réputation Fournisseur Microsoft
    2024-01-26T20:58:05.2733333+00:00

    Bonjour,

    Merci d'avoir sollicité la communauté Q&A France.

    Est-ce que le problème persiste avec la version 17.6.8?

    Cordialement,

    Omar,

    Si cette réponse a répondu à votre question, veuillez « Accepter comme réponse » et voter en utilisant « Pouce levé » afin que la pertinence de ce message s’améliore lorsque quelqu’un dans la communauté recherche une requête similaire.

    0 commentaires Aucun commentaire

5 réponses supplémentaires

Trier par : Le plus utile
  1. Omar Kefi (Convergys Corporation) 340 Points de réputation Fournisseur Microsoft
    2024-01-29T19:11:15.0566667+00:00

    Bonjour ,

    c'est mieux d'ajouter une référence à l’espace du nom Reflection, car c’est là d’après la documentation que la classe MethodInvoker.

    MethodInvoker Classe

    l’addition se fait avec Using .

    using System.Reflection;

    Cordialement,

    Omar,

    Si cette réponse a répondu à votre question, veuillez « Accepter comme réponse » et voter en utilisant « Pouce levé » afin que la pertinence de ce message s’améliore lorsque quelqu’un dans la communauté recherche une requête similaire.

    2 personnes ont trouvé cette réponse utile.
    0 commentaires Aucun commentaire

  2. Gilbert Tordeur 146 Points de réputation
    2024-01-28T09:39:57.86+00:00

    Bonjour Omar. L'erreur subsiste en version 17.6.8 (build 400). Le message d'erreur concernant la ligne 37 est précisément : The type or namespace name 'MethodInvoker' could not be found (are you missing a using directive or an assembly reference?) (CS0246). Voici le code d'une application cocoa très simple qui reproduit l'erreur :

    using AppKit;
    using CoreGraphics;
    using System;
    using System.Threading.Tasks;
    
    namespace TestMethodInvoker
    {
        public partial class ViewController : NSViewController
        {
            private NSButton btnUpdate;
            private NSTextField labelResult;
    
            public ViewController(IntPtr handle) : base(handle)
            {
            }
    
            public override void ViewDidLoad()
            {
                base.ViewDidLoad();
    
                // Do any additional setup after loading the view.
                btnUpdate = new NSButton(new CGRect(10, 200, 100, 23));
                View.AddSubview(btnUpdate);
                btnUpdate.Title = "Run";
                btnUpdate.Activated += btnUpdate_Click;
    
                labelResult = new NSTextField(new CGRect(120, 200, 200, 23));
                View.AddSubview(labelResult);
                labelResult.StringValue = "Valeur initiale";
            }
    
            private void btnUpdate_Click(object sender, EventArgs e)
            {
                Task.Run(() =>
                {
                    string text = "Updated from another thread";
                    this.Invoke((MethodInvoker)delegate
                    {
                        labelResult.Text = text;
                    });
                });
            }
        }
    }
    
    

    Cordialement, Gilbert

    1 personne a trouvé cette réponse utile.

  3. Gilbert Tordeur 146 Points de réputation
    2024-01-30T13:57:28.5466667+00:00

    J'ai fini par trouver en demandant à Bing. Après plusieurs mauvaises réponses, il a fini par me proposer ceci, qui fonctionne correctement :

            private void btnUpdate_Click(object sender, EventArgs e)
            {
                Task.Run(() =>
                {
                    for (int i = 0; i < 10; i++)
                    {
                        Thread.Sleep(1000);
                        string text = i.ToString();
                        BeginInvokeOnMainThread(() =>
                        {
                            labelResult.StringValue = text;
                        });
                    }
                });
            }
    
    

    Merci encore et bonne journée. Gilbert

    1 personne a trouvé cette réponse utile.

  4. Gilbert Tordeur 146 Points de réputation
    2024-02-14T09:44:02.3466667+00:00

    Bonjour. Je reçois un email d'Alexis : "... N'oubliez pas de marquer comme réponse votre solution ...". Mais je ne peux pas : un bouton "Accepter la réponse" est affiché sur chaque réponse, sauf celles dont je suis moi-même l'auteur. Or c'est moi qui ai fini par publier la bonne réponse. Dès lors, comment faire ?

    0 commentaires Aucun commentaire