Entwickler-Ecke
WinForms - Invoke, String mit übergeben
Ccenter - Mo 11.10.10 13:00
Titel: Invoke, String mit übergeben
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.
C#-Quelltext
1: 2: 3: 4: 5: 6:
| this.Invoke(new MethodInvoker(textWriteMethode)); ... public textWriteMethode(string text) { MessageBox.Show(text); } |
Ralf Jansen - Mo 11.10.10 13:14
MethodInvoker ist ein parameterloser Delegat den du wahrscheinlich verwendest weil er zufällig schon existiert.
C#-Quelltext
1:
| public delegate void MethodInvoker(); |
Du solltest also einfach einen eigenen Delagatentyp definieren der deine gewünschte Signatur versteht. Also z.B.
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 [
http://msdn.microsoft.com/de-de/library/a1hetckb.aspx] umfassend beschrieben.
Yogu - 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:
C#-Quelltext
1:
| Invoke(new Action<string>(deineMethode), deinParameter); |
Ccenter - 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 - Mo 11.10.10 17:18
Ccenter hat folgendes geschrieben : |
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 Methoden
signatur, 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.
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) { } }
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) { } } |
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.
Ccenter - Di 12.10.10 14:49
Danke an alle, sollte jetzt soweit klar sein =)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!