StringDictionary по сравнению со Словарем <строка, строка>

Я сталкивался с этой проблемой несколько раз в последние годы, когда писал код обработки потоков для нескольких проектов. Я предоставляю поздний ответ, потому что большинство других ответов, предоставляя альтернативы, на самом деле не отвечают на вопрос об тестировании. Мой ответ адресован случаям, когда нет альтернативы многопоточному коду;

Написание тестового многопоточного кода

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

Во-вторых, ошибки в многопоточном коде вероятны; ошибки, которые проявляются наименее часто, являются ошибками, которые будут проникать в производство, будут трудно воспроизвести даже в производстве и, таким образом, вызовут самые большие проблемы. По этой причине стандартный метод кодирования быстрого написания кода, а затем отладка его до его работы - плохая идея для многопоточного кода; это приведет к созданию кода, в котором исправлены простые ошибки, а опасные ошибки все еще существуют.

Вместо этого, при написании многопоточного кода, вы должны написать код с учетом того, что вы избежите писать ошибки в первую очередь. Если вы правильно удалили код обработки данных, то код обработки потоков должен быть достаточно малым - желательно несколько строк, в худшем случае несколько десятков строк, - что у вас есть возможность написать его без написания ошибки, и, конечно, без написания многих ошибок , если вы понимаете потоки, не торопитесь и будьте осторожны.

Написание модульных тестов для многопоточного кода

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

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

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

Наконец, отслеживайте количество ошибок, обнаруженных в вашем тесте. Если ваш тест содержит 80% кода, можно ожидать, что он поймает около 80% ваших ошибок. Если ваш тест хорошо разработан, но не обнаруживает ошибок, существует разумная вероятность того, что у вас нет дополнительных ошибок, которые будут отображаться только в процессе производства. Если тест поймает одну или две ошибки, вам все равно повезет. Помимо этого, и вы можете подумать о тщательном просмотре или даже полном переписывании кода обработки потоков, так как вполне вероятно, что код по-прежнему содержит скрытые ошибки, которые будет очень сложно найти до тех пор, пока код не будет создан, и очень трудно установить.

74
задан Scott Ivey 9 March 2009 в 19:44
поделиться

2 ответа

Dictionary<string, string> более современный подход. Это реализует IEnumerable<T>, и это больше подходит для материала LINQy.

StringDictionary старый школьный путь. Это было там передо днями дженериков. Я использовал бы его только при взаимодействии через интерфейс с унаследованным кодом.

88
ответ дан Mehrdad Afshari 7 November 2019 в 07:31
поделиться

Я думаю, что StringDictionary является в значительной степени устаревшим. Это существовало в v1.1 платформы (перед дженериками), таким образом, это была превосходящая версия в то время (по сравнению с неуниверсальным Словарем), но в этой точке, я не полагаю, что существуют любые определенные преимущества для него по Словарю.

Однако существуют недостатки к StringDictionary. Нижние регистры StringDictionary Ваши значения ключа автоматически, и нет никаких опций для управления этим.

См.:

http://social.msdn.microsoft.com/forums/en-US/netfxbcl/thread/59f38f98-6e53-431c-a6df-b2502c60e1e9/

36
ответ дан Reed Copsey 7 November 2019 в 07:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: