Модераторы: gambit, Partizan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> XmlTextWriter.Flush() vs ObjectDisposedException, trouble 
:(
    Опции темы
neutrino
Дата 16.3.2007, 22:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Gothic soul
****


Профиль
Группа: Модератор
Сообщений: 3041
Регистрация: 25.3.2002
Где: Верхняя Галилея, Кармиэль

Репутация: нет
Всего: 62



Приветствую!

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

В чем может быть проблема?

Актуальный кусок кода:

Код

        private void flushBuffer()
        {
            lock (fullLogger)
            {
                foreach (ILogEntry logEntry in fullLogger)
                {
                    logEntry.serialize(logWriter);
                }
                
                logWriter.Flush(); // <-- Тут вылетает ObjectDisposedException 

                fullLogger.Clear();
            }
        }

        public virtual void Dispose()
        {
            if (currentEntries.Count > 0)
            {
                fullLogger = switchLogger();
                flushBuffer();
            }
            logWriter.Close();
        }

        ~LogWriter()
        {
            Dispose();
        }



Присоединённый файл ( Кол-во скачиваний: 3 )
Присоединённый файл  ObjectDisposedException.JPG 71,22 Kb


--------------------
The truth comes from within ...

Покойся с миром, Vit 
PM MAIL WWW ICQ Skype GTalk   Вверх
mr.DUDA
Дата 17.3.2007, 11:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 24
Всего: 232



Что-то мне подсказывает, строки 20 и 21 надо поменять местами. Метод switchLogger случаем не закрывает стрим ?


--------------------
user posted image
PM MAIL WWW   Вверх
neutrino
Дата 17.3.2007, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Gothic soul
****


Профиль
Группа: Модератор
Сообщений: 3041
Регистрация: 25.3.2002
Где: Верхняя Галилея, Кармиэль

Репутация: нет
Всего: 62



Цитата(mr.DUDA @  17.3.2007,  10:22 Найти цитируемый пост)
Что-то мне подсказывает, строки 20 и 21 надо поменять местами. Метод switchLogger случаем не закрывает стрим ? 

Нет, нет. Это как раз так задумано. Я использую double buffering: в то время, как пополняется один буфер, второй записывается на диск в отдельном потоке. Этот метод как раз и переключает буфер. Вот полный код класса:

Код

using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;
using System.Xml;
using System.Threading;

namespace KTAClient
{
    class LogWriter : IDisposable
    {
        // Log entries that must be written to file.
        // We define pair of buffers for flushing one of them
        // while the second is busy with appending.
        private ArrayList logEntries1;
        private ArrayList logEntries2;
        // Reference to current logger
        private ArrayList currentEntries;
        // Full logger (must flush to disk)
        private ArrayList fullLogger;

        // Max buffer size. If number of log entries exceeds this value
        // flush forced.
        private int maxBufferSize;

        // Log file writer
        private XmlTextWriter logWriter;

        private string filename;

        public LogWriter(string filename, int maxBufferSize)
        {
            this.filename = filename;
            logEntries1 = new ArrayList(maxBufferSize);
            logEntries2 = new ArrayList(maxBufferSize);

            logWriter = new XmlTextWriter(filename, Encoding.Unicode);
            logWriter.Formatting = Formatting.Indented;
            logWriter.Indentation = 1;
            logWriter.IndentChar = '\t';
            currentEntries = logEntries1;
            this.maxBufferSize = maxBufferSize;
        }

        public void log(ILogEntry logEntry)
        {
            if (currentEntries.Count == maxBufferSize)
            {
                fullLogger = switchLogger();
                // Run flush in separate thread.
                forceAsyncFlush();
            }

            currentEntries.Add(logEntry);
        }

        private void forceAsyncFlush()
        {
            ThreadStart asyncFlushJob = new ThreadStart(flushBuffer);
            Thread asyncFlushThread = new Thread(asyncFlushJob);
            asyncFlushThread.Start();
        }

        private void flushBuffer()
        {
            lock (fullLogger)
            {
                foreach (ILogEntry logEntry in fullLogger)
                {
                    logEntry.serialize(logWriter);
                }
                
                logWriter.Flush();

                fullLogger.Clear();
            }
        }

        private ArrayList switchLogger()
        {
            if (currentEntries == logEntries1)
            {
                currentEntries = logEntries2;
                return logEntries1;
            }
            else
            {
                currentEntries = logEntries1;
                return logEntries2;
            }
        }

        #region IDisposable Members

        public virtual void Dispose()
        {
            if (currentEntries.Count > 0)
            {
                fullLogger = switchLogger();
                flushBuffer();
            }
            logWriter.Close();
        }

        ~LogWriter()
        {
            using (logWriter)
                Dispose();
        }

        #endregion
    }
}




--------------------
The truth comes from within ...

Покойся с миром, Vit 
PM MAIL WWW ICQ Skype GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Разработка Windows Forms | Следующая тема »


 




[ Время генерации скрипта: 0.0432 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.