代码之家  ›  专栏  ›  技术社区  ›  gsharp

列表的一般问题

  •  2
  • gsharp  · 技术社区  · 14 年前

    我正在尝试创建一个并行的助手类( 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>>();
        }
    }
    

    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 });

    也许有人知道怎么解决这个问题?

    2 回复  |  直到 13 年前
        1
  •  1
  •   flq    13 年前

    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”。您的助手现在可以通过调用Cacheresult方法来关闭接口。在helper之外,您仍然可以拥有通用实现。

    public static class ParallelRunner
    {
        public static void Run(IEnumerable<IParallelFunction> parallelFunctions)
        {
            Parallel.ForEach(parallelFunctions, f => f.CacheResult());
        }
    }
    
        2
  •  1
  •   Dario    14 年前

    IParallelFunc<out T> 那个 ParallelFunc<T> IParallelFunc<int> 和一个 IParallelFunc<string> IParallelFunc<object> 用你的方法来处理。