Должен ли я использовать статическую функцию в C #, где много вызовов одного и того же функции? - PullRequest
3 голосов
/ 03 декабря 2011

Консольное приложение Джона вызывает мою функцию DLL много раз (~ 15 раз в секунду).Я думаю поставить эту функцию как статический метод.

Я знаю, что:

  1. Она может получить доступ только к статическим объектам и объектам.
  2. Ему не нужен экземпляр для запуска функции.

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

У каждого Джонавызовы моей функции находятся в новом потоке, который он создает.

  • Если в моей функции есть ошибка, как это повлияет на все другие вызовы?
  • Должен ли я сделать эту функциюобычная функция с экземпляром для класса (который Джон создаст)?
  • А как насчет GC?

Каков наилучший практический ответ на этот вопрос?

Ответы [ 3 ]

2 голосов
/ 03 декабря 2011

Как правило, если ваш статический метод не использует какого-либо состояния (т.е. читает и записывает в статические поля и свойства или вызывает другие статические методы, которые делают это), побочных эффектов для вызывающей стороны не будет, нетнезависимо от того, сколько потоков они запускают.

Если вы запрашиваете наилучшую практику, статические методы, как правило, плохая идея.Если вообще, статические методы должны использоваться только для очень общих функциональных возможностей утилиты.

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

О сборке мусора, да, конечно, есть некоторые издержки, но в настоящее время это жертваесли вы идете по маршруту управляемой памятью ОО.Если вы хотите больше контроля, используйте небезопасный код или язык, такой как C ++ или Vala.

2 голосов
/ 03 декабря 2011

Похоже, что может быть проблема.Вызов метода, который работает с статическими (общими) объектами в многопоточной среде, должен зазвонить для вас несколько тревожных звонков.

Просмотрите ваш код и, если есть вероятность, что к общему объекту обращаютсядва (или более) потока одновременно, сделайте объект полем экземпляра и сделайте ваши методы экземплярами методов.

Конечно, существует ли риск, во многом зависит от реального кода (который вы надеваетене показывать), но выполнение всех вызовов нестатически означает, что вы снижаете потенциальный риск.

0 голосов
/ 03 декабря 2011

Я бы согласился с Wiktor (+1), но также добавил бы, что если синхронизация требуется в статическом методе, может быть более эффективно использовать несколько экземпляров.В противном случае наличие множества потоков может быть бессмысленным, поскольку только один может получить доступ к критическому разделу одновременно.

...