"Christmas - the time to fix the computers of your loved ones" « Lord Wyrm

Delegates/Events - wie auslösen ?!

Vanongart 07.08.2007 - 16:36 883 3
Posts

Vanongart

Bloody Newbie
Registered: May 2004
Location: bei Wien
Posts: 42
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
Avatar
Registered: Sep 2004
Location: 1030
Posts: 1588
Zitat von Vanongart
[...]
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:

Code:
public event EventHandler FinishedRequest;


wenn die abfrage beendet ist, event feuern mit

Code:
this.FinishedRequest(..., ...);


und in der "aufrufenden klasse" aufs event hören mit

Code:
class1 sample = new class1();
sample.FinishedRequest += new EventHandler(OnFinishedRequest);

und eine dementsprechende methode anlegen

Code:
private void OnFinishedRequest(object sender, EventArgs e) {
...
}


hth, hab leider wie gesagt nicht genügend zeit das "verständlicher" zu beschreiben.

Triple-X

Addicted
Avatar
Registered: Feb 2001
Location: Pregarten (OÖ)
Posts: 485
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
Registered: May 2004
Location: bei Wien
Posts: 42
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
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz