Delegates/Events - wie auslösen ?!
Vanongart 07.08.2007 - 16:36 883 3
Vanongart
Bloody Newbie
|
Hi,
Hab ein Problem mit Delegates/Events, bin jetz schon länger am C# Programmieren doch erst jetz brauch ich das zeug unbedingt. Hab bis jetzt immer ein wenig herum-gearbeitet.
Im Prinzip isses so: Ich habe eine Klasse welche mit Webabfragen ausführt, die Abfrage wird als Thread gestartet und soll ein Event in der aufrufenen Klasse auslösen wenn die Abfrage Beendet ist.
Dieses soll mit mehreren Klasse funktionieren, also es existieren mehrere Abfrageklassen, die Alle das gleiche Event (Aktualisierung) in der Hauptklasse auslösen.
In Foren finde ich immer einen komplett anderen Aufbau mit Events/Delegates (1 Publisher, 2 Subscirber), bei mir sollten es x Publisher und nur ein Subscriber sein, oder ich hab das ganze einfach falsch verstadnen.
Da ich das ganze nicht in meinem großen Programm testen will, hab ich mir ein kleines Beispielprog. geschrieben, welches Analog zu meinem großen funktioniert - zumindest vom Event/Delegate Teil.
Hier mein Test-Code:
namespace delegateTest { public delegate void myTestDelegate(); public partial class Form_Entry : Form { public event myTestDelegate myEvent;
public Form_Entry() { InitializeComponent(); myEvent += new myTestDelegate(print);
RequestClass1 MyClass = new RequestClass1(); RequestClass2 MyClass = new RequestClass2(); }
private void print() { textBox_Out.AppendText("Event Fired !!!" + Environment.NewLine); } }
class RequestClass1 { public myClass() { mytestfunction(); }
public void mytestfunction() { // invoke the myEvent event in Form_Entry } } class RequestClass2 { public myClass() { mytestfunction(); }
public void mytestfunction() { // invoke the myEvent event in Form_Entry } }
}
Hier sollen einfach meine beiden Request-Klassen in der Form_Entry das Event "myEvent" auslösen.
Wie mach ich das ?
|
3mind
mimimi
|
[...] Im Prinzip isses so: Ich habe eine Klasse welche mit Webabfragen ausführt, die Abfrage wird als Thread gestartet und soll ein Event in der aufrufenen Klasse auslösen wenn die Abfrage Beendet ist. [...] hab grad bissl wenig zeit, aber ich hier liegt ein denkfehler vor: event in anderer klasse aufrufen ist falsch, viel mehr verwendet man events im "passiven" modus, soll heißen deine klasse feuert nach beenden der abfrage ein event (ihr eigenes). die "aufrufende klasse" wie du sie darstellts hört auf dieses event und führt dann halt irgendwas aus. also: event in der abfrage klasse (class1) anlegen, bspw: public event EventHandler FinishedRequest;
wenn die abfrage beendet ist, event feuern mit this.FinishedRequest(..., ...);
und in der "aufrufenden klasse" aufs event hören mit class1 sample = new class1();
sample.FinishedRequest += new EventHandler(OnFinishedRequest);
und eine dementsprechende methode anlegen private void OnFinishedRequest(object sender, EventArgs e) {
...
}
hth, hab leider wie gesagt nicht genügend zeit das "verständlicher" zu beschreiben.
|
Triple-X
Addicted
|
3mind hat recht mit den Events, da unterliegst du einem Denkfehler.
Warum rufst du nicht einfach in deinen Abfrageklassen eine Methode von Form_Entry auf? Mit Form_Entry.Invoke sollte das machbar sein, wenn das Abfrageobjekt in einem eigenen Thread läuft.
|
Vanongart
Bloody Newbie
|
mhm Thx erstmal für die Antworten.
Ah - vielen Dank, jetz versteh ich meinen Fehler auch, hab von der falschen Seite gedacht ...
Bei deiner Lösung, Triple-X müsste ich der Abfrageklasse das Form_Entry Objekt (sich selber quasi) mitübergeben, damit ich eine Methode der Form aufrufen kann ? Und dann halt die Überprüfung auf aufrufenden Thread mit: If (this.textbox.InvokeReqired) .....
EDIT: Die Lösung mit den Delegates funktioniert prächtig ^^, thx, hat mir mehr geholfen als einige tutorials und co
Bearbeitet von Vanongart am 08.08.2007, 08:22
|