我正在尝试制作一个可以像在 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
获取数据属性(property)。
问题就在这里ParallelRunner.Run(new List<ParallelFunction> { pf1, pf2 });
如果 ParallelFunction 与泛型一起使用,我当然无法将两个不同的类型添加到列表中。
也许有人知道如何解决这个问题?
最佳答案
在泛型类型暴露给非泛型基础设施的情况下,我引入了一个非泛型接口(interface):
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; }
}
你看,我稍微更改了设计,以减少该类所做的工作。该接口(interface)可以公开非通用位“CacheResult”。您的 Helper 现在可以通过调用 Cacheresult 方法来关闭接口(interface)。在助手之外,您仍然可以拥有通用实现。
public static class ParallelRunner
{
public static void Run(IEnumerable<IParallelFunction> parallelFunctions)
{
Parallel.ForEach(parallelFunctions, f => f.CacheResult());
}
}
关于c# - List 的一般问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3856404/