从Parallel.For获取结果

时间:2011-02-07 15:43:04

标签: c# .net-4.0 parallel-extensions

我正在考虑使用Parallel.For来调用需要一段时间才能返回的网络服务,但是,我们知道我们可以同时多次调用它并且它不会比单个调用花费更长的时间

为此,我正在尝试使用Parallel.For,我真的想要检查一下我的想法是如何工作的。我可能有点过于谨慎,因为我不想搞砸应用程序,我想确保如果我们走这条路线,整个应用程序团队都会知道在访问并行代码时需要做些什么。 / p>

无论如何,这是我目前的工作和理解。

public IEnumerable<HotelAvail> GetAvailability (IList<string> codes, DateTime startDate, int numNights)
{
    HotelAvail[] result = new HotelAvail[codes.Count];

    Parallel.For(0, codes.Count, i =>
        {
            string code = codes[i];
            result[i] = new AvailService().
                GetAvailability(
                    code, startDate, numNights);
        });

    return result;
}

AvailService获取指定日期范围(startDate + numNights)的会议室空间。 code是该属性的标识符。

我在开始时设置了一个正确大小的结果数组,其中包含许多空插槽。

然后我并行调用该服务。该服务创建一个新的HotelAvail对象,并将其放在数组中的正确位置。

完成所有操作后,我返回数组。它应该在这一点上完全填充。应该没有空白。该服务不会影响系统状态的任何其他部分 - 它只是构建一个Web服务调用,调用它,并返回一个结果对象。

我有没有看到任何问题。

就像我上面所说的那样,我可能过于谨慎,但是我在更年轻和充满活力的日子里编写多线程代码而感到厌烦,我不想再犯同样的错误。

此外,此代码最终将在ASP.NET应用程序中结束。我依稀回忆起它对多线程代码抱怨很多。我可能遇到的任何其他问题?

2 个答案:

答案 0 :(得分:3)

对我来说看起来不错,不过我认为PLINQ会更优雅一点:

    public IEnumerable<HotelAvail> GetAvailability (IList<string> codes, 
                                                    DateTime startDate, 
                                                    int numNights)
    {
        return codes.AsParallel().AsOrdered().Select(code => 
                 new AvailService().GetAvailability(code, startDate, numNights))
                .ToList();
    }

答案 1 :(得分:1)

对于Asp.net问题,如果您的方法调用没有快速返回,您很可能会遇到应用程序超时。您可能希望为此方案执行的操作是使用AJAX为每个代码调用方法,在Web服务调用完成时返回HotelAvail对象,并在可用时使用新信息更新UI。