4

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

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

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

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 应用程序中。我依稀记得它对多线程代码的抱怨很多。我可能会在那里遇到任何其他问题?

4

2 回答 2

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();
    }
于 2011-02-07T17:06:25.137 回答
1

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

于 2011-02-07T15:53:24.727 回答