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