Je suis en train de faire une classe d'aide parallèle (ParallelRunner
) qui peut être utilisé comme dans la RequestService
classe:problème générique avec Liste
public class ParallelFunction
{
public ParallelFunction(Func<object> function)
{
Function = function;
}
public T GetResult<T>() where T : class
{
return (T) Data;
}
public Func<object> Function { get; private set; }
public object Data { private get; set; }
}
public static class ParallelRunner
{
public static void Run(IEnumerable<ParallelFunction> parallelFunctions)
{
Parallel.ForEach(parallelFunctions, f =>{f.Data = f.Function();});
}
}
public class RequestService
{
public void DoParallel()
{
var da = new RequestDataAccess();
var pf1 = new ParallelFunction(da.GetRequests);
var pf2 = new ParallelFunction(da.GetRequestAnswers);
ParallelRunner.Run(new List<ParallelFunction> { pf1, pf2 });
var requests = pf1.GetResult<List<Request>>();
var answers = pf2.GetResult<List<RequestAnswer>>();
}
}
ce que je vraiment avoir était une classe générique ParallelFunction comme que:
public class ParallelFunction<T> where T : class
{
public ParallelFunction(Func<T> function)
{
Function = function;
}
public Func<T> Function { get; private set; }
public T Data { get; set; }
}
Et au lieu d'obtenir les données de la GetResult<T>
qui fait une distribution du type souhaité, obtenir les données de la propriété T Data
.
Le problème est ici ParallelRunner.Run(new List<ParallelFunction> { pf1, pf2 });
si ParallelFunction est avec le générique je ne suis bien sûr pas en mesure d'ajouter deux types différents dans la liste.
Peut-être que quelqu'un a une bonne idée de comment résoudre ce problème?
Je ne pense pas que ce que vous demandez est directement possible, vous pourriez avoir une sorte d'interface ParallelFunction que les outils de classe générique, mais pour accéder à la dactylographiée réelle propriété des données que vous auriez reste à faire casting de l'interface à ParallelFunction. Peut-être pourriez-vous mettre en place un modèle de visiteur? –
BrandonAGr