2009-03-24 2 views
3

У меня есть вычислительно интенсивная задача, которую пользователи могут выполнять с помощью приложения Silverlight. Это очень простая задача для распараллеливания.Silverlight: Как получить ProcessorCount?

Моя проблема заключается в том, что System.Environment.ProcessorCount является критическим для безопасности, поэтому я не могу это легко проверить.

Я не хочу просто QueueUserWorkItem, потому что я не хочу иметь больше, чем количество исполняемых процессоров - это не поможет.

Один из способов описаны здесь: http://www.codeproject.com/KB/silverlight/multicore.aspx

Но это немного хака, и это было бы немного работы, чтобы сделать его достаточно надежным для 4 или 8 нитей систем.

Что такое «правильный» способ решить эту проблему? Или Silverlight просто вам не повезло?

+0

Будет ли много вреда, просто кодируя его для работы на 4 ядрах? Накладные расходы на одну базовую систему не будут такими уж плохими в моем опыте. – Chris

+0

Я попробую сравнить его и посмотреть, как сильно это повредит. Каждая задача имеет 1 или 2 МБ данных, и, таким образом, если я запускаю больше потоков, я думаю, что у меня будут проблемы с кешем в дополнение к перераспределению. – MichaelGG

ответ

3

Тот факт, что этот метод является SecurityCritical вместо SecuritySafeCritical, скорее всего является артефактом того факта, что в какой-то момент версия настольной версии .NET Framework потребовала от EnvironmentPermission доступа к этим данным.

С тех пор мы избавили спрос от настольных компьютеров, поэтому на самом деле имеет смысл, чтобы это было SafeCritical для Silverlight. Я поднял это как проблему, которую мы должны исправить в будущей версии Siverlight, и похоже, что мы сможем это сделать.

Если вы найдете больше случаев, когда есть общедоступные методы, которые чувствуют, что они должны быть SafeCritical вместо Critical в Silverlight, сделайте некоторую обратную связь на Microsoft Connect. Реальные люди действительно смотрят на эти проблемы, и это ваш лучший выбор, чтобы сообщить нам о ваших болевых точках.

На данный момент похоже, что вам придется пойти с обходным путем, но в какой-то момент мы исправим аннотацию безопасности здесь.

Это было исправлено в Silverlight 4.

1

II не знаю, что механизм обнаружения кодекса - это все так плохо. Если ничто другое не завершает этот код в метод, чтобы сделать первый удар в нем. Когда появляется лучший метод обнаружения, вы меняете реализацию на эту, но я понимаю, что проблема в том, что вам гарантировано только знать, что есть как минимум 2 ядра. Это, конечно, в зависимости от того, какая резьба вы хотите сделать, менее эффективна на отличном оборудовании.

Другая вещь, которую нужно сделать, - это разрешить пользователю настраивать количество потоков, которые они хотят запускать в вашем приложении, например, 7zip. если вы обнаружите 2+ ядра, вы можете открыть элемент управления спином, чтобы пользователь мог решить, сколько потоков они хотят. clunkier, чем автоматическое обнаружение, но, по крайней мере, в случае ядер 4+ у вас есть надежда, что код работает более оптимально.

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