Autor Beitrag
Ccenter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 154

Win7
C#
BeitragVerfasst: Mo 11.10.10 13:00 
Ich versuche gerade eine Methode per Invoke aufzurufen. Das funktioniert auch soweit. Allerdings möchte ich der Methode einen String übergeben und das gelingt mir einfach nicht. Ich hab mich jetzt schon halb tot gegoogled aber ich werde einfach nicht schlau daraus. Soweit ich das sehe muss ich das irgendwie mit Delegates machen. Da ich das aber nicht verstanden habe, hab ich ersteinmal versucht zu verstehen was delegates sind. Und da steh ich voll aufm Schlauch. Wäre nett wenn mir das jemand nochmal verständlich erklären könnte. Hier im Forum gibt es schon einen ähnlichen Beitrag zu, der hilft mir aber auch nicht wirklich weiter.

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
this.Invoke(new MethodInvoker(textWriteMethode));  // Hier möchte ich den String "test" übergeben
...
public textWriteMethode(string text)
{
    MessageBox.Show(text);
}
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mo 11.10.10 13:14 
MethodInvoker ist ein parameterloser Delegat den du wahrscheinlich verwendest weil er zufällig schon existiert.
ausblenden C#-Quelltext
1:
public delegate void MethodInvoker();					

Du solltest also einfach einen eigenen Delagatentyp definieren der deine gewünschte Signatur versteht. Also z.B.
ausblenden C#-Quelltext
1:
public delegate void MeinLieberMethodInvokerMitString(string text);					


Wenn du ein detailliertes Beispiel brauchst dann ist die Invoke Methode in der Hilfe zu Control.Invoke umfassend beschrieben.
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4796
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mo 11.10.10 13:18 
Hallo Ccenter,

meintest du diesen: www.c-sharp-forum.de/viewtopic.php?t=81735 ?
Wenn ja, was verstehst du daran nicht?
Yogu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Mo 11.10.10 13:23 
Noch einfacher geht es mit dem generischen Delegate Action<T>. Dann brauchst du nicht mal mehr selbst ein Delegate deklarieren:

ausblenden C#-Quelltext
1:
Invoke(new Action<string>(deineMethode), deinParameter);					
Ccenter Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 154

Win7
C#
BeitragVerfasst: Mo 11.10.10 16:53 
Das mit Invoke(new Action<string>(deineMethode), deinParameter); probiere ich gleich mal aus. Dank ;)

@Th69, nee ich meinte einen anderen Thread, in dem es darum ging was Delegates sind. Einen "normalen Thread" ohne Übergabe von Parametern bekomme ich hin per Invoke zu starten, mir ist nur nicht klar was genau jetzt ein Delegate ist bzw. macht. Und das ist ja wichtig um einen Paramter mit übergeben zu können.
Yogu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Mo 11.10.10 17:18 
user profile iconCcenter hat folgendes geschrieben Zum zitierten Posting springen:
mir ist nur nicht klar was genau jetzt ein Delegate ist bzw. macht.

Ein Delegate ist eine Beschreibung einer Methode. Um genau zu sein, wird die Methodensignatur, also die Parametertypen und -modifier, definiert. Eine Instanz eines Delegates muss nun genau diese Methode implementieren. Dafür übergibt man sie als Konstruktor im Parameter.

In Java gibt es keine Delegates, dort verwendet man Interfaces, was das ganze meiner Meinung nach verdeutlicht: Sie erlauben einen einheitlichen Zugriff auf irgendeine Methode, die die richtigen Parameter hat.

ausblenden Java-Quelltext:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
interface MyDelegate {
  void call(String arg0, int arg1);
}

class MyDelegateImplementation implements MyDelegate {
  public void call(String arg0, int arg1) {
    /* ... */
  }
}

// Oder als anomyme Klasse, ähnelt den Delegates aus C#:
class MyClass {
  public int field = 5;

  public MyDelegate getDelegate() {
    return new MyDelegate {
      public void call(String arg0, int arg1) {
        doSomething(arg0, arg1);
      }
    }
  }

  private void doSomething(String arg0, int arg1) {
    // Hier kann auf field zugegriffen werden
  }
}

Die letzte Klasse ist das Äquivalent zu Delegates in C#: Das Interfaces MyDelegate mit der Methode call wird implementiert; call ruft eine Methode des Objekts auf, das das Delegate instantiiert. So ungefähr macht es C# bzw. .NET auch.

Ich hoffe, das war jetzt nicht zu weit hergeholt.

Für diesen Beitrag haben gedankt: Ccenter
Ccenter Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 154

Win7
C#
BeitragVerfasst: Di 12.10.10 14:49 
Danke an alle, sollte jetzt soweit klar sein =)