![]() |
|
Модераторы: Partizan, gambit |
![]()
|
|
| pa6kevi4 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 14 Регистрация: 15.9.2009 Репутация: нет Всего: нет |
Здравствуйте, уважаемые винградовцы!
Реализован класс, записывающий данные в txt файл.
Подскажите, как преобразовать его так, чтобы при повторном вызове метода Log в разных потоках: 1) не приходилось каждый раз открывать заново файл 2) не приходилось ждать пока идёт запись (процесс записи занимает больше времени, чем получение данных (string message, MessageType messageType)), т.е сделать так, чтобы данные шли в очередь, и только потом записывались. Спасибо за ваш форум! |
|||
|
||||
| pa6kevi4 |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 14 Регистрация: 15.9.2009 Репутация: нет Всего: нет |
|
||||
|
|||||
| PashaPash |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1233 Регистрация: 3.1.2008 Репутация: 13 Всего: 49 |
pa6kevi4, полностью согласен со смайлом RTFM. Есть минимум 2 стандартных способа организовать логгирование - System.Diagnostics.Trace и EntLib Logging App Block. Нечего изобретать велосипед.
|
|||
|
||||
| ArchyDone |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 18 Регистрация: 2.5.2010 Репутация: нет Всего: нет |
Работает это так. Вы складываете свои сообщения в буфер - очередь. Размер очереди неограничен, или ограничен доступной памятью, но в переменной _maxsize Вы устанавливаете барьер. Как только в буфер попадает очередное ( допустим 100 ) сообщение, то создается вторичный поток, который блокирует очередь , открывает файл с кодировкой которая стоит в системе , файл для дописания в конец и перебрасывает сообщения в текстовый файл. Главный поток свободен и может исполняться. Деструктор разрушающий объект проверят пустая ли очередь , если нет , то снова создает поток , который дописывает все что есть в очереди в файл. Поток _workThread не делайте фоновым _workThread.IsBackground = true; - ни в коем случае вот так! |
||||
|
|||||
| jonie |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 22 Всего: 118 |
Мои замечания:
1) никогда, никогда не делайте логирование в потоках - обычно логирование это "критичные вещи" , а не "все подряд" и, поверьте, когда ваша программа реально упадет, вам лучше не иметь буферов в памяти с логами ).. конечно, иногда это все же несправедливо 2) никогда не изобретайте велосипед.. в интернет куча проверенных логгеров есть 3) всегда в лог методах делайте try{} catch{ /* eat all */} - вам не захочется чттобы при логировании сыпалось приложение - как в примере постом выше при занятом файле например. 4) всегда явно закрывайте StrimeWriter в логгере - вы же знаете что будет если в методе Dispose потока, обернутого в using вызовется эксепшен, не так ли?) 5) если уж используете блокировку - используйте везде 6) а вообще логгер - типичный singleton 7)ну и конечно все знают про Synchronized метод в очереди (как пример) 8) всегда именуйте переменные понятными именами, а параметры тем более. Параметр "s" не является таковым. 9) вместо switch -а по enum-у, в котором нет пробелов, конечно использовать массив и enum как индекс эффективнее (да и смотрится изящнее)... ... можно много критиковать в общем) -------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
|||
|
||||
| ArchyDone |
|
||||||||
|
Новичок Профиль Группа: Участник Сообщений: 18 Регистрация: 2.5.2010 Репутация: нет Всего: нет |
2 jonie спасибо за конструктивную критику.
Я честно не знаю , и если не отсылая за тридяведь земель, поясните как может в методе Dispose вызваться экспепшен ?
Разве я не использовал ее в нужном месте , что значит везде? Пальцем ткните
Пояснения пожалуйста в студию
Примерчик плиз |
||||||||
|
|||||||||
| jonie |
|
||||||||||||||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 22 Всего: 118 |
Singleton - паттерн проектирования (читать википедию например). В вашем логгере можно создать два инстанса одного логгера -> ваш логгер упадет из-за доступа к файлам (два логгера ваши не смогут писать в один файл). Используйте например такой код:
Добавлено через 2 минуты и 54 секунды
-------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
||||||||||||||||||
|
|||||||||||||||||||
![]()
|
| Прежде чем создать тему, посмотрите сюда: | |
|
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |