并行化分配的更好方法

时间:2017-03-22 19:39:56

标签: c# lambda func

现在,我仍然对Lambdas,Funcs,Delegates,Actions等有点新意,但我正在尝试找到一种更好的方法来并行化依赖于数据库操作的分配。换句话说,我有很多数据可以一次性从数据库中提取,我想在并行而不是串行中进行。

到目前为止,我正在使用List<Func<object>>Parallel.Foreach()组合,但我无法帮助,但想知道是否有更优雅的方法来执行此操作。我曾尝试过Parallel.Invoke,但是我无法在Lambda表达式上调用Invoke()(也许没有func文字?)。显然,在调用Invoke()然后将其视为Action之前,必须首先将其分配给Func。

这是我到目前为止所做的。

            List<Func<Object>> Assignments = new List<Func<object>>();
            Assignments.Add( () => lookups.Acknowledgements = DBRepository.GetAll<Acknowledgement>());
            Assignments.Add( () => lookups.AcknowledgementDetails = DBRepository.GetAll<AcknowledgementDetail>());
            Assignments.Add( () => lookups.AcknowledgementRadioButtons = DBRepository.GetAll<AcknowledgementRadioButtonSection>());
            Assignments.Add( () => lookups.AcknowledgementRadionButtonItems = DBRepository.GetAll<AcknowledgementRadioButtonSectionItem>());
            Assignments.Add( () => lookups.AcknowledgementTextBoxes = DBRepository.GetAll<AcknowledgementTextBoxSection>());
            Assignments.Add( () => lookups.MarketingPages = DBRepository.GetAll<MarketingPage>());
            Assignments.Add( () => lookups.MarketingPageDetails = DBRepository.GetAll<MarketingPage_Detail>());
            // and many many more...
            Parallel.ForEach(Assignments, (assignement) =>
            {
                assignement.Invoke();

            });

是否有一种更漂亮,更优雅或更好的方式来并行化分配操作?

1 个答案:

答案 0 :(得分:2)

您仍然可以使用Parallel.Invoke来保存一些行:

Parallel.Invoke(
    () => lookups.Acknowledgements = DBRepository.GetAll<Acknowledgement>(),
    () => lookups.AcknowledgementDetails = DBRepository.GetAll<AcknowledgementDetail>()
);