Linq блокирует поток? - PullRequest
       5

Linq блокирует поток?

0 голосов
/ 20 октября 2011

Я обращаюсь к некоторой хранимой процедуре к vb.net linq (SQL к linq .... вручную), потому что хранимая процедура медленная.

Я использую запросы linq в параллельных потоках.

После запуска анализа производительности я обнаружил, что linq, по-видимому, блокирует коллекцию исходного кода (например, cache.IPMS_TBL_EL_PRICE_COMPONENT в период кода ниже) при запросах.

Это правда? Есть ли опция (not_lock / lock) для linq? Я действительно не хочу, чтобы коллекция была заблокирована. Это замедлит многопоточный запрос.

Большое спасибо.

Период кода:

см. В http://imgur.com/Z9vsR или см. Ниже

insert0 = (From PPC In cache.IPMS_TBL_EL_PRODUCT_PRICE_COMPONENT_MAPPING
                           From PC In cache.IPMS_TBL_EL_PRICE_COMPONENT
                           Join LK In cache.IPMS_TBL_LOOKUP
                             On PC.Component_Type_Id Equals LK.Lookup_Id
                           Where (PC.Component_Id = PPC.Component_Id OrElse PC.Component_Type_Id = CC3_ID) _
                             AndAlso LK.Commodity_Id = ELE_COMMODITY_ID _
                             AndAlso LK.Lookup_Type.ToLower = PRICE_COMPONENT_TYPE.ToLower _
                             AndAlso PPC.Product_Id = IN_PRODUCT_ID _
                             AndAlso PPC.Price_Type_Id = IN_PRICE_TYPE_ID _
                             AndAlso PC.Is_Deleted = 0 _
                             AndAlso LK.Lookup_Id > MINUS_HUNDRED _
                             AndAlso PC.Component_Id > MINUS_HUNDRED _
                             AndAlso lookupValues.Contains(LK.Lookup_Value.ToLower) _
                             AndAlso (Not PC.ISO_Id.HasValue OrElse Not deletedISO.Contains(PC.ISO_Id.Value))
                           Select New PriceComponents() With {.ComponentID = PC.Component_Id,
                                                              .ComponentName = PC.Component_Name,
                                                              .ComponentTypeID = PC.Component_Type_Id,
                                                              .ComponentTypeName = LK.Lookup_Value,
                                                              .Sequence = PC.Sequence,
                                                              .OrderSequence = orderSequeceDict(LK.Lookup_Value.ToLower),
                                                              .IsMTM = PC.Is_MTM,
                                                              .UcapUsageFactorUnitPrice = PC.UCAP_Usage_Factor_UnitPrice,
                                                              .Percentage = PERCENTAGE}
                           ).OrderBy(Function(e As PriceComponents) e.OrderSequence).ThenBy(Function(e As PriceComponents) e.Sequence) _
                           .Distinct(New PriceComponentsComparer_PK_9_Fields).ToList

1 Ответ

3 голосов
/ 20 октября 2011

Вы звоните ToList, что заставляет запрос оценивать с нетерпением (тут же).

С ToList он будет перебирать набор результатов, возвращая запрошенные результаты - это действительно будет использоватьтекущий поток.

Вы можете отложить оценку , не вызывая ToList, и оценивать только тогда, когда вам действительно нужно перебрать результаты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...