【发布时间】:2014-12-08 14:33:48
【问题描述】:
我正在使用依赖于 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++;
}
}
【问题讨论】:
标签: c#-4.0 task-parallel-library