Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Asynchroner Delegate Callback mit eigener Signatur
Lexodus
myCSharp.de - Member



Dabei seit:
Beiträge: 257
Herkunft: Schweiz

Themenstarter:

Asynchroner Delegate Callback mit eigener Signatur

beantworten | zitieren | melden

Hallo zusammen

Weiss einer ob es möglich ist, wenn ich nen Delegate Asynchron aufrufe die Signatur der Callback Methode nach eigenem gusto zu gestalten?

bei BeginnInvoke(CallBackMethode) will er ja immer diese Signatur;

void CallbackMethod(IAsyncResult asyncResult)
{

}

Danke für die Hilfe.

Gruss

Lexy
If you can't make it, fake it.
private Nachricht | Beiträge des Benutzers
kleines_eichhoernchen
myCSharp.de - Member

Avatar #avatar-2079.jpg


Dabei seit:
Beiträge: 4055
Herkunft: Ursprünglich Vogtland, jetzt Much

beantworten | zitieren | melden

Ne, EventHandler oder Callback-Methoden müssen die gleiche Signatur haben wie der entsprechende Delegate. Alles andere wäre nicht typsicher.

Was du allerdings machen kannst, ist dir bestimmte Werte über das State-Object zu merken oder aber du kapselst das ganze in eine seperate Klasse und greifst mittels this auf weitere Object-Instanzen oder Werte zu.
Es gibt 3 Arten von Menschen, die die bis 3 zählen können und die, die es nicht können...
private Nachricht | Beiträge des Benutzers
Lexodus
myCSharp.de - Member



Dabei seit:
Beiträge: 257
Herkunft: Schweiz

Themenstarter:

beantworten | zitieren | melden

Naja vielleicht häts ja nen Typsicheren Weg gegeben ;-)

@Edit
Das mit dem State werd ich mir mal angucken.
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von Lexodus am .
If you can't make it, fake it.
private Nachricht | Beiträge des Benutzers
Lexodus
myCSharp.de - Member



Dabei seit:
Beiträge: 257
Herkunft: Schweiz

Themenstarter:

beantworten | zitieren | melden

Fein, das mit dem Stateobjekt hat funktioniert;

Ich definier mein Delegate jetzt schematisch so;




public delegate void AsynchronousDelegate(State state);

public class State
{
	public bool success;
}

Bei der Asynchronen aufzurufenden Methode definier ich die Signatur so;


public void AsyncMethod(State state)
{
	state.success = true;
}

Delegate Aufruf so;


public void InitialCaller()
{
	State state = new State();
	AsynchronousDelegate asynchronousDelegate = AsyncMethod;
	asynchronousDelegate.BeginInvoke(state, Callback, state);
}

und im Callback kann ich das hier machen;


public static void Callback(IAsyncResult ar)  
{
	State state = (State)ar.AsyncState;  
	//Do something depending on state
} 

Schade dass die Generics nicht von Anfang an im Framework waren, dann wärs sogar noch typsicher :D.

@Edit
Je länger ich das anschaue desto mehr hab ich das Gefühl das es nicht sauber ist ne Referenz so in die Methode reinzureichen.... Stichwort MarshalbyRef oder ähnliches
Irgend n Guru hier? Scheint wohl nicht der richtige Ansatz zu sein mit dem "State"...?
Dieser Beitrag wurde 3 mal editiert, zum letzten Mal von Lexodus am .
If you can't make it, fake it.
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 52329
Herkunft: Berlin

beantworten | zitieren | melden

Hallo Lexodus,

was soll an dem state-Objekt nicht der richtige Ansatz sein bzw. wann meinst du, dass es schiefgehen könnte? Es geht doch nur darum, dass eine Referenz auf ein beliebiges Objekt durchgereicht wird. Ich sehe da erstmal keine Probleme.

herbivore
private Nachricht | Beiträge des Benutzers
kleines_eichhoernchen
myCSharp.de - Member

Avatar #avatar-2079.jpg


Dabei seit:
Beiträge: 4055
Herkunft: Ursprünglich Vogtland, jetzt Much

beantworten | zitieren | melden

OK, Missverständnis, ich bin davon ausgegangen, dass du bei BeginInvoke beispielsweise FileStream.BeginInvoke meinst und nicht Delegate.BeginInvoke.

Bei deinem eigenem Delegaten darfst du natürlich beliebige Parameter/Argumente verwenden und die Funktion/Delegate so gestalten wie du willst. Der C# Compiler generiert anschließend eine entsprechende (Begin)Invoke-Funktion.

Bei bereits existieren Delegaten geht das allerdings nicht. Die Signatur des Delegaten muss mit dem des EventHandlers übereinstimmen.

Ich persönlich bin allerdings gegen Delegaten mit vielen Argumenten. 2 Argumente maximal und das nach dem Schema Sender, EventArgs. Aber selbst das ist meist nicht zwingend notwendig, wenn der EventHandler eine Instanzfunktion ist und alles wesentliches über die Instanz-Member zu erreichen ist.

Noch als Hinweis am Rande, wenn du BeginInvoke aufrufst, solltest du auch immer EndInvoke aufrufen. Bei Klassen aus dem .NET Framework entsteht sonst ein Speicherleck, da intern sich jede Klasse merkt, wer BeginInvoke aufgerufen hat.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von kleines_eichhoernchen am .
Es gibt 3 Arten von Menschen, die die bis 3 zählen können und die, die es nicht können...
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 52329
Herkunft: Berlin

beantworten | zitieren | melden

Hallo kleines_eichhoernchen,

es geht um die Signatur des Callback-Delegaten und die ist nicht beliebig, sondern vorgegeben.

herbivore
private Nachricht | Beiträge des Benutzers