2011-02-07 93 views
4

我正在寻找使用Parallel.For来调用需要一段时间才能返回的Web服务,但是,我们知道我们可以同时多次调用它,并且不会花费太多时间单一电话。从Parallel.For获取结果

为此,我尝试了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是属性的标识符。

我在开始时设置了大量空槽的正确大小的结果数组。

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

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

有没有这个问题,我没有看到。

就像我上面说过的,我可能过于谨慎了,但在更年轻和旺盛的日子里我写了多线程代码,我不想再犯同样的错误。

此外,这段代码最终将在ASP.NET应用程序中结束。我隐约记得,它抱怨了很多关于多线程代码。我可能在那里遇到任何其他问题?

回答

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

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

+0

这部分是我想要使用的Parallel.For如果我必须做出10个服务电话的原因,每个大约需要4到7秒才能返回,然后是40到70秒来获得这些数据。如果我可以平行打电话,结果是每次通话平均6-9秒,但我可以一次打5个电话,然后是12到18秒。显着的节约。 – 2011-02-07 15:56:16