2013-10-20 5 views
5

Ich versuche, System.Threading.Tasks.Parallel.ForEach in einem tragbaren Klassenbibliotheksprojekt mit Profil 158 (Targeting .NET für Windows Store Apps, .NET Framework 4.5, Silverlight 5 und Windows Phone 8.) ich renne von Visual Studio Professional 2012 Update 3Verwenden von System.Threading.Tasks.Parallel mit .NET Portable Subset

Wenn ich Code wie folgt schreiben:

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

der Compiler sagt, dass „der Typ oder Namespace Der Name 'Parallel' existiert nicht im Namespace 'System.Threading.Tasks' "(Ich weiß, dass dieser Beispielcode nicht wirklich Thread-sicher ist.)

Ich habe auf MSDN bestätigt, dass Parallel.ForEach für tragbare Klassenbibliotheken unterstützt wird. Wenn ich den Objektbrowser verwende, um meinen Verweis auf ".NET Portable Subset" zu durchsuchen, sehe ich System.Threading.Tasks.Parallel, Mitglied der Komponente ".NET Portable Subset", und es hat tatsächlich Definitionen für System.Threading.Tasks .Parallel. Für jeden.

Was muss ich tun, um in meinem PCL-Projekt auf Parallel.ForEach zugreifen zu können?

Antwort

7

Die MSDN-Einführung in Portable Class Libraries, in dem Abschnitt mit dem Titel Unterstützte Typen und Mitglieder zeigt an, dass Sie einfach auf die Versionsinformationen Abschnitt eines gegebenen MSDN-Hilfethema, wenn ein Mitglied zu bestimmen beziehen kann für Portable Klassenbibliotheken unterstützt wird . Wenn Sie sich die Mitgliedstabelle für eine Klasse ansehen, wird ein bestimmtes Symbol neben den für PCL unterstützten Mitgliedern angezeigt.

So, zum Beispiel, in der Dokumentation für die System.Threading.Tasks Namespace, der Tabelleneintrag für Parallel hat das Symbol, dass es für PCL unterstützt wird. Die Referenzdokumentation für Parallel.ForEach enthält einen Versionsinformationsteil, der angibt, dass "Unterstützt in: Portable Class Library".

Es stellt sich heraus, dass diese Informationen nicht granular genug sind. Detailliertere Informationen werden von Microsoft veröffentlicht, sind aber meines Wissens nur in Form einer Excel-Tabelle verfügbar. Es wurde ursprünglich aus dem Microsoft Blog-Artikel How to Make Portable Class Libraries Work for You verlinkt. Die von Microsoft bereitgestellte verkürzte URL ist http://sdrv.ms/OVdfNc, die auf https://skydrive.live.com/view.aspx?resid=8A7FB4A4B32FB2C9!180&app=Excel&authkey=!AHaBmLAhQ49YCI0

erweitert. Dies ist eine 1.1 MB Kalkulationstabelle. Leider wird in dieser Tabelle gezeigt, dass Parallel.ForEach für .NET 4.5 unterstützt wird, aber nicht von SL5 oder WP8.

+0

Im August 2014 Microso ft hat ein Befehlszeilentool und eine Visual Studio-Erweiterung, den .NET Portability Analyzer, veröffentlicht, der Ihr Projekt analysiert und Ihnen zeigt, welche Plattformen es unterstützt. Der Analysator zeigt Ihnen, welche Codezeilen in Ihrem Projekt APIS verwenden, die nicht von verschiedenen Plattformen unterstützt werden. Die Ankündigung ist unter http://blogs.msdn.com/b/dotnet/archive/2014/08/06/leveraging-existing-code-across-net-platforms.aspx. Dies scheint viel bequemer zu sein, als es in einer Tabelle nachzuschlagen. –

+0

Diese Tabelle wird jetzt online (via Excel Online) angezeigt und zeigt sich ziemlich schnell, so dass Sie nicht lokal herunterladen müssen –

0

Sie manuell eine Liste von Aufgaben aufbauen konnte und dann warten, einfach für sie alle:

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); 

Basierend auf this post

Verwandte Themen