Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 4.0 C语言中的并行类#_C# 4.0_Task Parallel Library - Fatal编程技术网

C# 4.0 C语言中的并行类#

C# 4.0 C语言中的并行类#,c#-4.0,task-parallel-library,C# 4.0,Task Parallel Library,我正在使用依赖于noOFResults的for循环将一个对象复制到另一个对象。我用Parallel.For替换了Foreach循环以提高性能,但同样会导致主要性能下降。所以我想知道这是什么原因 int resultCount = 0; var apiSearchResults = new PS_HotelSearchResult[results.Count]; foreach (BE_HotelSearchResult result in results)

我正在使用依赖于noOFResults的for循环将一个对象复制到另一个对象。我用Parallel.For替换了Foreach循环以提高性能,但同样会导致主要性能下降。所以我想知道这是什么原因

 int resultCount = 0;
        var apiSearchResults = new PS_HotelSearchResult[results.Count];
        foreach (BE_HotelSearchResult result in results)
        {

            apiSearchResults[resultCount] = new PS_HotelSearchResult();



            #region Fields of First Search
            apiSearchResults[resultCount].RateType = (PS_RateType)result.RateType;
            apiSearchResults[resultCount].HotelCode = result.HotelCode;
            apiSearchResults[resultCount].Discount = result.AmountBeforeDiscountInSupplierCurr -
                                           result.AmountAfterTaxInSupplierCurr;
            apiSearchResults[resultCount].AmountAfterTax = result.AmountAfterTaxInSupplierCurr;
            apiSearchResults[resultCount].AmountBeforeTax = result.AmountBeforeTaxInSupplierCurr;
            apiSearchResults[resultCount].Currency = result.CurrencySupplier;
            apiSearchResults[resultCount].IsUniversalApiResult = true;
            if (result.Price != null)
            {
                apiSearchResults[resultCount].TotalGP = result.Price.TotalGP;
            }
            #endregion

            #region Fields for Room
            if (!Equals(result.RoomDetails, null))
            {
                int roomCount = 0;
                apiSearchResults[resultCount].RoomDetails =
                    new PS_HotelRoomsDetails[result.RoomDetails.Length];
                foreach (BE_HotelRoomsDetails roomDetail in result.RoomDetails)
                {
                    if (roomDetail.CancellationPolicies == null)
                    {
                        throw new BusinessServiceException("HotelPrice.GetPrice - CancellationPolicies SHOULD NOT BE Null for rooms");
                    }
                    apiSearchResults[resultCount].RoomDetails[roomCount] = new PS_HotelRoomsDetails
                    {
                        SequenceNo = roomDetail.SequenceNo,

                        #region ExtraGuestCharge and ChildCharges
                        // Multiplied by number of nights becuase its a day wise price and we are setting it roomwise
                        SellExtraGuestCharges = roomDetail.SellExtraGuestCharges,
                        PubExtraGuestCharges = roomDetail.PubExtraGuestCharges,
                        ChildCharges = roomDetail.ChildCharges,
                        SellChildCharges = roomDetail.SellChildCharges,
                        #endregion

                        #region Discount and Tax
                        Discount = roomDetail.Discount,
                        TotalTax = roomDetail.TotalTax,
                        #endregion

                    };

                    int k = 0;

                    #region DayWiseRate
                    if (!Equals(roomDetail.Rates, null))
                    {
                        apiSearchResults[resultCount].RoomDetails[roomCount].Rates =
                            new PS_RoomRates[roomDetail.Rates.Length];
                        foreach (BE_RoomRates rate in roomDetail.Rates)
                        {
                            apiSearchResults[resultCount].RoomDetails[roomCount].Rates[k] = new PS_RoomRates
                            {

                                Amount = rate.Amount,
                                //Pricing is wrong
                                //SellingFare = rate.SellingFare

                            };
                            k++;
                        }
                    }
                    #endregion

                    k = 0;

                    #region Additional Charges
                    if (!Equals(roomDetail.AdditionalCharges, null))
                    {
                        apiSearchResults[resultCount].RoomDetails[roomCount].AdditionalCharges =
                            new PS_AdditionalCharges[roomDetail.AdditionalCharges.Count];
                        foreach (
                            BE_AdditionalCharges additionalCharge in
                                roomDetail.AdditionalCharges)
                        {
                            apiSearchResults[resultCount].RoomDetails[roomCount].AdditionalCharges[k] = new PS_AdditionalCharges
                            {
                                Charge = additionalCharge.Charge,
                                IncludedInTotal = additionalCharge.IncludedInTotal
                            };
                            k++;
                        }
                    }
                    #endregion

                    #region Price and Price Component
                    apiSearchResults[resultCount].RoomDetails[roomCount].Price = new HotelPriceAccounts();
                    if (!Equals(roomDetail.Price, null))
                    {

                        apiSearchResults[resultCount].RoomDetails[roomCount].Price.Discount = roomDetail.Price.Discount;
                        apiSearchResults[resultCount].RoomDetails[roomCount].Price.PublishedFare = roomDetail.Price.PublishedFare;
                        apiSearchResults[resultCount].RoomDetails[roomCount].Price.Tax = roomDetail.Price.Tax;
                        apiSearchResults[resultCount].RoomDetails[roomCount].Price.OtherCharge = roomDetail.Price.OtherCharges;
                        apiSearchResults[resultCount].RoomDetails[roomCount].Price.TotalGP = roomDetail.Price.TotalGP;
                        apiSearchResults[resultCount].RoomDetails[roomCount].Price.IsGPEnabled = roomDetail.Price.IsGPEnabled;
                        apiSearchResults[resultCount].RoomDetails[roomCount].Price.AgentMarkUpType =
                            (AgentMarkUpType)roomDetail.Price.AgentMarkUpType;
                        apiSearchResults[resultCount].RoomDetails[roomCount].Price.PriceId = roomDetail.Price.PriceId;
                    }
                    #endregion




                    roomCount++;
                }
            }

代码中没有for循环,只有foreach循环

使用Parallel.For时,不要期望循环自动更快

特别是当迭代对外部范围有影响时,迭代很难并行运行。因此,您所添加的只是在任务之间划分迭代的开销


外部范围受数量变化的影响。循环中的k和apiSearchResults,仅举几个例子。

@Emo抱歉,我用Parallel.For替换了first foreach。我想优化上面的代码,大约需要350毫秒才能得到300个结果。在这种情况下我能做什么?正如我所解释的:尝试使迭代相互独立(不要在下一次迭代中使用的迭代中更改变量)。因为(每个)不是一个魔弹,不要期望它神奇地加速代码。