PDA

View Full Version : [c#] - Future


gugoXX
09-12-2008, 09:52
Pensavate di trovare un thread sul futuro del C#?
E invece no.
Nelle parallel extension PLINQ sono stati introdotti gli oggetti Future.
Cosa e' un oggetto Future?
Immaginate di avere un pezzi di codice indipendente che possono essere eseguiti in parallelo.
Con un oggetto Future si puo' lanciare l'esecuzione in background e ritirare il risultato successivamente.
Un oggetto Future non e' nient'altro che il Wrapper di un Thread, che lancia l'esecuzione in background e che ritira il risultato non appena viene richiesto.
Questo concetto messo insieme ad un Generic molto semplice crea una facility abbastanza comoda da usarsi.


// Per poter eseguire questo codice in parallelo
double r1 = EseguoCodice(Parametro A1, Parametro A2);
double r2 = EseguoCodice(Parametro B1, Parametro B2);
double r3 = EseguoCodice(Parametro C1, Parametro C2);
double r4 = EseguoCodice(Parametro D1, Parametro D2);
double fin = r1*r2*r3*r4;

//Potrei eseguire il seguente:
var v1 = Future<double>.Create( () => EseguoCodice(Parametro A1, Parametro A2));
var v2 = Future<double>.Create( () => EseguoCodice(Parametro B1, Parametro B2));
var v3 = Future<double>.Create( () => EseguoCodice(Parametro C1, Parametro C2));
var v4 = Future<double>.Create( () => EseguoCodice(Parametro D1, Parametro D2));

double fin = v1.Result * v2.Result * v3.Result * v4.Result;


Quando si tratta di usare solo un Future, al posto di linkare la DLL del PLINQ (Tuttora non inserita all'interno del Framework), si puo' utilizzare questo pezzo di codice, che dovrebbe avere lo stesso comportamento.


public class Future<T>
{
Thread th;

private T _Result;

public T Result
{
get
{
th.Join();
return _Result;
}
}

Func<T> exec;

public Future(Func<T> Exec)
{
exec = Exec;
th = new Thread(new ThreadStart(executor));
th.Start();
}

public static Future<T> Create(Func<T> Exec)
{
return new Future<T>(Exec);
}

private void executor()
{
_Result = exec();
}
}

cdimauro
11-12-2008, 21:09
Interessante. Grazie per l'idea. :)