none
Invoke - Funktionen RRS feed

  • Frage

  • Hallo,

    die Invoke ist ja mächtig, für Werte, wie string, double, relativ einfach anzuwenden.
    Wie sieht so was bei Funktionen aus?

    Also das
         cbWidth.Items.Insert(0, Settings.Default.DefaultValueWidth);
     
     Grüße Andreas

         

      public void SetWithList(List<double> doubleList)
        {
          cbWidth.Invoke(new Action<List<double>>
                    (s => { cbWidth.DataSource = s; }), doubleList);
          // cbWidth.Refresh();
    
          // Set or add the default value if not exist.
          var qry = (from p in doubleList
                orderby p
                where p == Settings.Default.DefaultValueWidth
                select p).FirstOrDefault();
    
          if (qry != null)
          {
            //  cbWidth.SelectedItem = qry;
            cbWidth.Invoke(new Action<double>
                    (s1 => { cbWidth.SelectedItem = s1; }), qry);
          }
          else
          {
            cbWidth.Items.Insert(0, Settings.Default.DefaultValueWidth);
            cbWidth.Invoke(new Action<int, object>
                    (s2 => { cbWidth.Items.Insert = s2; }), 0, Settings.Default.DefaultValueWidth);
          }
          // int z = qry.CompareTo(Settings.Default.DefaultValueWidth);
        }
    
    
    Montag, 28. März 2011 15:43

Antworten

  • Hi Andreas,

    mit Lambdafunktionen kannst du alles damit machen, einfach eine Action wie eine Mehode Deklarieren.

    Control.Invoke(() => {//Mache hier was
    };

     

    Grüße

    Montag, 28. März 2011 17:52
  • Hallo Andreas,

    Dein Beispiel-Code geht da etwas durcheinander und es fehlen auch Klassen-Deklarationen, aber ich glaube ich weiss, was Du meinst:

            cbWidth.Items.Insert(0, Settings.Default.DefaultValueWidth);
            cbWidth.Invoke(new Action<int, object>((s2, obj) => 
            { cbWidth.Items[0] = obj; }), 0, 123);
    
            var ret = cbWidth.Invoke(new Func<int, object>((index) =>
            { return cbWidth.Items[index]; }), 0);
    

    Die unteren Codezeilen geben einen Wert zurück, was dem Begriff "Funktion" nahe kommt (in C#.NET sagt man allerdings doch eher "Methoden").

    Ansonsten marshallt Invoke mit Func genauso zuverlässig in den Steuerelement-Thread, wie mit Action, wenn gesichert ist, dass kein anderer Thread die Rückgabevariable (gleichzeitig) setzt.

    ciao Frank
    Montag, 28. März 2011 18:00

Alle Antworten

  • Hi Andreas,

    mit Lambdafunktionen kannst du alles damit machen, einfach eine Action wie eine Mehode Deklarieren.

    Control.Invoke(() => {//Mache hier was
    };

     

    Grüße

    Montag, 28. März 2011 17:52
  • Hallo Andreas,

    Dein Beispiel-Code geht da etwas durcheinander und es fehlen auch Klassen-Deklarationen, aber ich glaube ich weiss, was Du meinst:

            cbWidth.Items.Insert(0, Settings.Default.DefaultValueWidth);
            cbWidth.Invoke(new Action<int, object>((s2, obj) => 
            { cbWidth.Items[0] = obj; }), 0, 123);
    
            var ret = cbWidth.Invoke(new Func<int, object>((index) =>
            { return cbWidth.Items[index]; }), 0);
    

    Die unteren Codezeilen geben einen Wert zurück, was dem Begriff "Funktion" nahe kommt (in C#.NET sagt man allerdings doch eher "Methoden").

    Ansonsten marshallt Invoke mit Func genauso zuverlässig in den Steuerelement-Thread, wie mit Action, wenn gesichert ist, dass kein anderer Thread die Rückgabevariable (gleichzeitig) setzt.

    ciao Frank
    Montag, 28. März 2011 18:00
  • Hallo,

    alles korrekt erkannt. Ja mein Code ging ja nicht.

      cbWidth.Items.Insert(0, Settings.Default.DefaultValueWidth);

       Der Index, der Wert hat mich irritiert.  Ich wollte halt das Insert in die Action Methode irgendwie bringen.

    cbWidth.Items.Insert(0, Settings.Default.DefaultValueWidth);

    Das muss jetzt schon weglassen und über den Index, updaten. Sehe ich richtig?

    Danke an beide.

     

    Andreas

    Montag, 28. März 2011 18:43
  • Hallo Andreas,

    •  Ich wollte halt das Insert in die Action Methode irgendwie bringen ...

    zum Beispiel so:

          cbWidth.Invoke(new Action<int, object>((index, wert) =>
            {
              cbWidth.Items.Insert(index, wert);
            }), 0, Settings.Default.DefaultValueWidth);
    

    ciao Frank
    Montag, 28. März 2011 19:31
  • zum Beispiel so:

       cbWidth.Invoke(new Action<int, object>((index, wert) =>
    
        {
    
         cbWidth.Items.Insert(index, wert);
    
        }), 0, Settings.Default.DefaultValueWidth);
    
    

    Guten Morgen Frank!

    Ja jetzt ist es eindeutig, passt!

     

    Schöner Tag Andreas

    Dienstag, 29. März 2011 04:47