Avatar billede halden Nybegynder
27. januar 2009 - 11:49 Der er 2 kommentarer og
1 løsning

Windows form og delegate

Et hurtigt eksempel:

public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Main main = new Main();
            main.Notify += new Main.NotifyOfDoStuff(main_Notify);
            Main.DelegateDoStuff del = new Main.DelegateDoStuff(main.DoStuff);
            del.BeginInvoke("test", null, null);

        }

        void main_Notify(object sender, MyEventArgs e)
        {
            textBox1.AppendText("test");  //denne linie smider InvalidOperationException
        }

    }


public class Main
    {
        public delegate void NotifyOfDoStuff(object sender, MyEventArgs e);
        public event NotifyOfDoStuff Notify;

        public delegate void DelegateDoStuff(string value);

        public void DoStuff(string value)
        {
            for (int i = 0; i < 50; i++)
            {
                //Some stuff to do
                int x = 1 + 2;

                //Notify surroundings
                if (Notify != null)
                {
                    MyEventArgs args = new MyEventArgs(i);
                    Notify(this, args);
                }
            }
        }
    }


Når jeg prøver at skrive til textBox1 opstår der en InvalidOperationException - opstår da en anden tråd prøver at opdatere noget på UI tråden. Hvorfor er måden er gør det på ikke lovligt og hvordan fixer jeg det?
Avatar billede kalp Novice
27. januar 2009 - 13:16 #1
uden og kigge på din kode andet end den linje der fejler - prøv følgende.
(ikke tested.. men sådan ca. i hvertfald)

  void main_Notify(object sender, MyEventArgs e)
        {
          if(this.InvokeRequired){
              ParameterizedThreadStart start = new ParameterizedThreadStart(Update);
              this.Invoke(start, "test");
          }else Update("test");
        }

og opret denne metode

public void Update(object text){
  textBox1.AppendText(text);
}
Avatar billede halden Nybegynder
27. januar 2009 - 13:37 #2
jeg fik det løst ved at gøre følgende i min form class:

public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Main main = new Main();
            main.Notify += new Main.NotifyOfDoStuff(main_Notify);
            Main.DelegateDoStuff del = new Main.DelegateDoStuff(main.DoStuff);
            del.BeginInvoke("test", null, null);

        }

        delegate void SetStringDelegate(string parameter);
        void main_Notify(string value)
        {
            if (textBox1.InvokeRequired)
            {
                Invoke(new SetStringDelegate(main_Notify), new object[] { value });
            }
            else
            {
                textBox1.AppendText(value + Environment.NewLine);
            }
        }
    }

hvilket er stort set det samme som du også skriver :)
Smid svar for point...
Avatar billede kalp Novice
27. januar 2009 - 13:41 #3
=)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester