?
Hallo.
In SomeFunction findet die eigentliche Arbeit statt.
Möchtest Du nun für jede Methode, die Du asynchron ausführen willst, einen solchen Aufstand machen?
Gutes Design wäre, den veränderbaren Teil (SomeFunction) irgendwie auszulagern.
Erstmal mit C#-Mitteln im wesentlichen das, was Du gemacht hast:
static double Worker(double param1)
{
double product = param1;
for (int i = 0; i < param1; i++)
{
product *= param1;
}
return product;
}
static void Main(string[] args)
{
Func<double, double> async = Worker;
async.BeginInvoke(5, IAsyncResult =>
{
Func<double, double> res = (Func<double, double>)IAsyncResult.AsyncState;
Console.WriteLine(res.EndInvoke(IAsyncResult));
}, async);
}
Schön wäre nun eine wiederverwendbare Lösung. Vielleicht so:
static void Async<T, TRes>(T t, Func<T, TRes> asyncWorker, Action<TRes> callback)
{
asyncWorker.BeginInvoke(t, IAsyncResult =>
{
Func<T, TRes> res = (Func<T, TRes>)IAsyncResult.AsyncState;
callback(res.EndInvoke(IAsyncResult));
}, asyncWorker);
}
Edit: Etwas kürzer
static void Async<T, TRes>(T t, Func<T, TRes> asyncWorker, Action<TRes> callback)
{
asyncWorker.BeginInvoke(t, IAsyncResult => callback(asyncWorker.EndInvoke(IAsyncResult)), null);
}
Dann genügt ein einfacher Aufruf:
Async<double, double>(5, Worker, (res => Console.WriteLine(res)));
um den Parameter (5) asynchron an die Worker-Methode zu übergeben. Das dritte Argument
ist das Callback sobald die Methode fertig ist.
Vielleicht kann man das ganze jetzt noch für andere Parameterzahlen erweitern. Momentan funktioniert es nur
mit einem Parameter und einem Rückgabewert.
Auf jeden Fall kann man jetzt in einer Zeile machen, wofür Dein Ansatz ein paar dutzend Zeilen benötigt.
Edit: Das ganze nur so als Idee. Es spricht nichts dagegen das ganze nochmal in eine Klasse zu packen und mit einem Event mehrere Observer zu realisieren.