C# 从Parallel.For获取结果

C# 从Parallel.For获取结果,c#,.net-4.0,parallel-extensions,C#,.net 4.0,Parallel Extensions,我正在研究使用并行。对于需要一段时间才能返回的web服务,我们知道可以同时调用多次,并且不会比单个调用花费太多时间 为此,我正在尝试类似的方法。因为,我真的很想用感觉来检验我的想法,看看这是如何工作的。我可能有点过于谨慎了,因为我不想把应用程序搞砸,我想确保如果我们走这条路,整个应用程序团队都知道在访问并行代码时需要做什么 无论如何,这是我目前的工作和理解 public IEnumerable<HotelAvail> GetAvailability (IList<string&

我正在研究使用
并行。对于需要一段时间才能返回的web服务,我们知道可以同时调用多次,并且不会比单个调用花费太多时间

为此,我正在尝试类似的方法。因为,我真的很想用感觉来检验我的想法,看看这是如何工作的。我可能有点过于谨慎了,因为我不想把应用程序搞砸,我想确保如果我们走这条路,整个应用程序团队都知道在访问并行代码时需要做什么

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

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;
}
public IEnumerable GetAvailability(IList代码、日期时间开始日期、整数)
{
HotelAvail[]结果=新的HotelAvail[codes.Count];
Parallel.For(0,code.Count,i=>
{
字符串代码=代码[i];
结果[i]=新的可用服务()。
获取可用性(
代码、起始日期、数值);
});
返回结果;
}
AvailService
获取指定日期范围(
startDate
+
numNights
)的房间可用性。
code
是属性的标识符

我在一开始就设置了一个大小正确的结果数组,其中有很多空插槽

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

完成所有操作后,我返回数组。到目前为止,它应该是完全填充的。不应该有空白。该服务不影响系统状态的任何其他部分——它只是构建一个web服务调用,调用它,并返回一个结果对象

这有什么我没有看到的问题吗

正如我上面所说的,我可能过于谨慎了,但在更加年轻和繁荣的日子里,我被编写多线程代码所累,我不想再次犯同样的错误


此外,此代码最终将出现在ASP.NET应用程序中。我隐约记得,它抱怨了很多关于多线程代码的问题。我在这里可能会遇到其他问题吗?

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

在我看来还可以,但我认为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();
    }
public IEnumerable GetAvailability(IList代码,
日期时间开始日期,
整数)
{
返回代码.AsParallel().AsOrdered().Select(代码=>
new AvailService().GetAvailability(代码、开始日期、数值))
.ToList();
}

这就是我想使用并行的部分原因。因为如果我必须打10个服务电话,每个电话大约需要4到7秒才能返回,那么获取数据需要40到70秒。如果我可以并行调用它们,结果是每个调用平均6-9秒,但我可以一次调用5个,那么这是12到18秒。然而,我对ASP.NET的担忧更多的是它抛出异常,因为事情发生在“错误”的线程上,或者它不知道的线程上。这只是一种模糊的感觉,我几年前在一些非常狡猾的代码上见过一次,但此后再也没有见过。