2009-03-24 33 views
3

Ich habe eine rechenintensive Aufgabe, die Benutzer mit einer Silverlight-App ausführen können. Es ist eine sehr einfache Aufgabe, zu parallelisieren.Silverlight: Wie erhält man ProcessorCount?

Mein Problem ist, dass die System.Environment.ProcessorCount Security Critical ist, also kann ich das nicht einfach überprüfen.

Ich möchte nicht nur QueueUserWorkItem, weil ich nicht mehr als die Anzahl der Prozessoren ausführen wollen - das wird nicht helfen.

Eine Abhilfe ist hier beschrieben: http://www.codeproject.com/KB/silverlight/multicore.aspx

Aber es ist ein bisschen hackish, und es wäre ein bisschen Arbeit, um es für 4 oder 8 Fadensysteme maßen zuverlässig zu machen.

Was ist der "richtige" Weg, dies zu lösen? Oder lässt Silverlight dich hier einfach nicht glücklich sein?

+0

Wird es viel schaden, es einfach zu codieren, um auf 4 Kernen zu laufen? Der Aufwand für ein einzelnes Kernsystem wird meiner Erfahrung nach nicht so schlecht sein. – Chris

+0

Ich werde versuchen, es zu Benchmarking und sehen, wie viel es weh tut. Jede Aufgabe hat 1 oder 2 MB an Daten, und wenn ich also mehr Threads laufen lasse, denke ich, dass ich neben dem Overhead auch Cache-Probleme haben werde. – MichaelGG

Antwort

3

Die Tatsache, dass diese Methode SecurityCritical anstelle von SecuritySafeCritical ist, ist wahrscheinlich ein Artefakt der Tatsache, dass die Desktopversion .NET Framework-Version irgendwann EnvironmentPermission forderte, um diese Daten zu erhalten.

Wir haben seither die Nachfrage auf der Desktopseite gelockert, so dass es wirklich Sinn macht, SafeCritical auf Silverlight zu sein. Ich habe dies als ein Problem angesprochen, das wir in einer zukünftigen Version von Siverlight beheben sollten, und es sieht so aus, als könnten wir dies tun.

Wenn Sie mehr Fälle finden, in denen öffentliche Methoden vorhanden sind, die in Silverlight eher SafeCritical als Critical sein sollten, senden Sie eine Rückmeldung an Microsoft Connect. Echte Leute sehen sich diese Probleme an und es ist deine beste Entscheidung, uns deine Schmerzpunkte mitzuteilen.

Für den Moment sieht es so aus, als müssten Sie mit der bereitgestellten Problemumgehung arbeiten, aber irgendwann werden wir die Sicherheitsanmerkung hier korrigieren.

Dies wurde in Silverlight 4 behoben.

1

Ich weiß nicht, dass der Codeprojekt-Erkennungsmechanismus so schlecht ist. Wenn nichts anderes übrig ist, wickeln Sie diesen Code in eine Methode ein, um einen ersten Stich zu machen. Wenn eine bessere Erkennungsmethode verfügbar ist, ändern Sie die Implementierung in diese, aber ich verstehe das Problem, dass Sie nur wissen, dass es mindestens 2 Kerne gibt. Dies ist natürlich abhängig von der Threading, die Sie tun möchten, ist weniger leistungsfähig auf großartiger Hardware.

die andere yuck Sache zu tun ist, um dem Benutzer zu ermöglichen, die Anzahl der Threads, die sie in Ihrer App wie 7zip ausführen möchten, anzupassen. Wenn Sie zwei oder mehr Kerne entdecken, können Sie ein Spin-Steuerelement verfügbar machen, damit der Benutzer entscheiden kann, wie viele Threads er haben möchte. klirrender als eine automatische Erkennung, aber zumindest im Fall von 4+ Kernen haben Sie die Hoffnung, dass der Code optimal läuft.

Verwandte Themen