我正在尝试创建一个可以在ParallelRunner
类中使用的并行助手类(RequestService
):
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>>();
}
}
我真正希望拥有的是类似的通用ParallelFunction类:
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; }
}
而不是从GetResult<T>
获取所需类型的演员数据,而不是从T Data
属性获取数据。
问题在于ParallelRunner.Run(new List<ParallelFunction> { pf1, pf2 });
如果ParallelFunction与通用符号相同,我当然无法将不同的类型添加到列表中。
也许有人知道如何解决这个问题?
答案 0 :(得分:1)
使用IParallelFunc<out T>
实现的变体通用接口ParallelFunc<T>
。然后,IParallelFunc<int>
和IParallelFunc<string>
都可以推广到IParallelFunc<object>
并由您的方法处理。
答案 1 :(得分:1)
在泛型类型暴露给非泛型基础结构的情况下,我引入了一个非泛型的接口:
public class ParallelFunction<T> : IParallelFunction
{
private readonly Func<T> function;
public ParallelFunction(Func<T> function)
{
this.function = function;
}
public void CacheResult()
{
Data = function();
}
public T Data { get; private set; }
}
你看,我改变了设计,以减少课程所做的事情。该接口可以暴露非通用位“CacheResult”。您的Helper现在可以通过调用Cacheresult方法来处理接口。在帮助程序之外,您仍然可以使用通用实现。
public static class ParallelRunner
{
public static void Run(IEnumerable<IParallelFunction> parallelFunctions)
{
Parallel.ForEach(parallelFunctions, f => f.CacheResult());
}
}