2013-08-15 1 views
1

Я рассматриваю возможность создания собственного метода расширения PLinq, чтобы обеспечить функцию, описанную в моем недавнем вопросе: Specify task timeout in parallel linq to objects. Я хотел бы повторно использовать как можно большую существующую структуру .Net, включая любой код, который уже может указывать степень параллелизма в запросе PLinq.Прочитать степень параллелизма в методе расширения PLinq

В приведенном ниже блоке кода я указываю степень параллелизма. Предполагая, что CustomForAll является настраиваемым методом расширения PLinq с той же сигнатурой, что и существующий метод ForAll, как бы я прочитал степень параллелизма, указанную в TSource?

private PictureList FetchPictures(List<Picture> wallResults) 
{     
     wallResults 
      .AsParallel() 
      .WithDegreeOfParallelism(10) 
      .CustomForAll(delegate(Picture p){ 
+0

Почему вы не можете использовать стандартную реализацию «ForAll»? –

+0

@ReedCopsey - Я хочу реализовать тайм-ауты для каждой задачи, а не токен отмены, который охватывает все задачи (см. Комментарии к моему связанному вопросу). – Peter

+0

Просто создайте его в 'Action ' и используйте ForAll –

ответ

2

К сожалению, это не поддерживается. PLINQ не был разработан таким образом, чтобы разрешать сторонние расширения, не возвращаясь к IEnumerable<T>.

Степень параллелизма сохраняется в классе ParallelQuery в переменной частного члена (private QuerySettings m_specifiedSettings, в поле int? m_degreeOfParallism).

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

 Смежные вопросы

  • Нет связанных вопросов^_^