Использование System.Threading.Tasks.Parallel с переносимым подмножеством .NET

Я пытаюсь использовать System.Threading.Tasks.Parallel.ForEach в проекте переносимой библиотеки классов, используя профиль 158 (нацеленный на .NET для приложений Магазина Windows, .NET Framework 4.5, Silverlight 5 и Windows Phone 8.) Я запускаю Visual Studio Professional 2012, обновление 3.

Когда я пишу такой код:

var list = new List<int> {1, 2, 3, 4};
int whoCares;
System.Threading.Tasks.Parallel.ForEach(list, (item) => whoCares += item);

компилятор говорит, что «имя типа или пространства имен «Parallel» не существует в пространстве имен «System.Threading.Tasks» (я понимаю, что этот пример кода на самом деле не является потокобезопасным).

Я подтвердил в MSDN, что Parallel.ForEach поддерживается для переносимых библиотек классов. Если я использую Object Browser для просмотра моей ссылки на «.NET Portable Subset», я вижу System.Threading.Tasks.Parallel, член компонента «.NET Portable Subset», и у него действительно есть определения для System.Threading.Tasks. .Parallel.ForEach.

Что мне нужно сделать, чтобы получить доступ к Parallel.ForEach в моем проекте PCL?


person Tim Crews    schedule 20.10.2013    source источник


Ответы (3)


Введение MSDN в Portable Class Libraries, в Раздел под названием Поддерживаемые типы и элементы указывает, что вы можете просто обратиться к разделу Информация о версии данного раздела справки MSDN, чтобы определить, поддерживается ли элемент для переносимых библиотек классов. В качестве альтернативы, при просмотре таблицы членов для класса рядом с членами, которые поддерживаются для PCL, появится определенный значок.

Так, например, в документации для System. Threading.Tasks Namespace, в записи таблицы для Parallel есть значок, указывающий, что он поддерживается для PCL. В справочной документации для Parallel.ForEach есть раздел "Информация о версии". что означает «Поддерживается в: Portable Class Library».

Оказывается, эта информация недостаточно детализирована. Microsoft публикует более детализированную информацию, но, насколько мне известно, она доступна только в виде электронной таблицы Excel. Первоначально на него была ссылка из статьи блога Microsoft Как заставить переносимые библиотеки классов работать на вас. Короткий URL-адрес, предоставленный Microsoft, — http://sdrv.ms/OVdfNc, который расширяется до https://skydrive

Это таблица размером 1,1 МБ. Увы, в этой таблице показано, что Parallel.ForEach поддерживается для .NET 4.5, но не поддерживается SL5 или WP8.

person Tim Crews    schedule 21.10.2013
comment
В августе 2014 года Microsoft выпустила инструмент командной строки и расширение Visual Studio, анализатор переносимости .NET, который анализирует ваш проект и показывает, какие платформы он поддерживает. Анализатор показывает, какие строки кода в вашем проекте используют APIS, не поддерживаемые различными платформами. Объявление находится по адресу blogs.msdn.com/b/dotnet/archive/2014/08/06/. Это кажется гораздо более удобным, чем поиск в электронной таблице. - person Tim Crews; 11.08.2014
comment
эта электронная таблица теперь отображается в Интернете (через Excel Online) и отображается довольно быстро, поэтому нет необходимости загружать локально - person George Birbilis; 04.06.2015

Существует (очень) частичная реализация, доступная в Microsoft Research (используется в библиотеке автоматической компоновки графиков, которая теперь является открытым исходным кодом по лицензии MIT) по адресу:

https://github.com/Microsoft/automatic-graph-layout/blob/master/GraphLayout/MsaglSilverlight/Compatibility.cs

person George Birbilis    schedule 03.06.2015

Вы можете вручную создать список задач, а затем просто дождаться их всех:

int whoCares;
var list = new List<int> {1, 2, 3, 4};
List<Task> myTasks = new List<Task>();

foreach (var item in list) // Artificially implement Parallel.For because this is a PCL
{
    myTasks.Add(Task.Run(() =>
    {
        // Task logic goes here
        whoCares += item
    }));
}

await Task.WhenAll(myTasks);

На основе этого сообщения

person Paul Michaels    schedule 12.01.2017