Laden...

Asynchroner Delegate Callback mit eigener Signatur

Erstellt von Lexodus vor 15 Jahren Letzter Beitrag vor 15 Jahren 1.201 Views
L
Lexodus Themenstarter:in
254 Beiträge seit 2005
vor 15 Jahren
Asynchroner Delegate Callback mit eigener Signatur

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.

3.971 Beiträge seit 2006
vor 15 Jahren

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...

L
Lexodus Themenstarter:in
254 Beiträge seit 2005
vor 15 Jahren

Naja vielleicht häts ja nen Typsicheren Weg gegeben 😉

@Edit
Das mit dem State werd ich mir mal angucken.

If you can't make it, fake it.

L
Lexodus Themenstarter:in
254 Beiträge seit 2005
vor 15 Jahren

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 😄.

@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"...?

If you can't make it, fake it.

49.485 Beiträge seit 2005
vor 15 Jahren

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

3.971 Beiträge seit 2006
vor 15 Jahren

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.

Es gibt 3 Arten von Menschen, die die bis 3 zählen können und die, die es nicht können...

49.485 Beiträge seit 2005
vor 15 Jahren

Hallo kleines_eichhoernchen,

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

herbivore