Значение не может быть нулевым. Имя параметра: дест - PullRequest
0 голосов
/ 29 октября 2019

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

System.ArgumentNullException: Value cannot be null.
Parameter name: dest

Я добавил && line.Lenght >0, потому что думал, что это может быть проблемой, но ничего не изменилось. Я получаю 1 полный архив за 3 часа, а иногда и половину второго, который меньше, я полагаю, он не закончен, но записан на диск с расширением .tmp. Я могу переименовать его в zip и открыть / распаковать / прочитать данные. Если я изменю «счетчик» на меньший период, например, на 10 минут, он записывает кучу архивов, как будто все в порядке. Достаточно, чтобы заставить меня думать, что ошибка исчезла. Так что, вероятно, эта ошибка обнаружится через 4-5 часов. Как это исправить?

Stacktrace:

[ERROR] FATAL UNHANDLED EXCEPTION: 
Unhandled Exception:
System.ArgumentNullException: Value cannot be null.
Parameter name: dest
  at System.IO.MemoryStream.set_Capacity (System.Int32 value)
  at System.IO.MemoryStream.EnsureCapacity (System.Int32 value)
  at System.IO.MemoryStream.Write (System.Byte[] buffer, System.Int32 offset, System.Int32 count)
  at SharpCompress.IO.NonDisposingStream.Write (System.Byte[] buffer, System.Int32 offset, System.Int32 count)
  at System.IO.Compression.ZipArchiveEntryStream.Write (System.Byte[] buffer, System.Int32 offset, System.Int32 count)
  at System.IO.StreamWriter.Flush (System.Boolean flushStream, System.Boolean flushEncoder)
  at System.IO.StreamWriter.Write (System.Char[] buffer, System.Int32 index, System.Int32 count)
  at System.IO.TextWriter.WriteLine (System.String value)
  at Program.DataWriter ()
  at System.Threading.ThreadHelper.ThreadStart_Context (System.Object state) 
  at System.Threading.ExecutionContext.RunInternal (System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, System.Object state, System.Boolean preserveSyncCtx)
  at System.Threading.ExecutionContext.Run (System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, System.Object state, System.Boolean preserveSyncCtx)
  at System.Threading.ExecutionContext.Run (System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, System.Object state)
  at System.Threading.ThreadHelper.ThreadStart () 

Вот код:

static ConcurrentQueue<string> queue = new ConcurrentQueue<string>();

static void Main(string[] args)
{
    Thread thread = new Thread(DataWriter);
    thread.Start();
}

static void DataWriter()
{
    while (true)
    {
        string start = DateTime.Now.ToString("yy-MM-dd-HH-mm-ss");
        DateTime counter = DateTime.Now.AddHours(3);

        using (var archive = ZipFile.Open(HistoryPath + "history-" + start + ".tmp", ZipArchiveMode.Update))
        {
            ZipArchiveEntry data = archive.CreateEntry("data-" + start + ".txt");
            using (StreamWriter writer = new StreamWriter(data.Open()))
            {
                while (DateTime.Now < counter)
                {
                    if (queue.TryDequeue(out string line))
                    {
                        if (line != null && line.Length > 0)
                        {
                            writer.WriteLine(line);
                        }
                    }

                    System.Threading.Thread.Sleep(10);
                }
            }
        }

        File.Move(HistoryPath + "history-" + start + ".tmp", HistoryPath + "history-" + start + "_"+ DateTime.Now.ToString("yy-MM-dd-HH-mm-ss") + ".zip");
    }
}

1 Ответ

0 голосов
/ 29 октября 2019

Изменение библиотеки ZIP решило мою проблему. Я изменил Microsoft System.IO.Compression на ICSharpCode.SharpZipLib . Код почти такой же. Теперь все работает как надо. Кажется, в библиотеке microsofts есть ошибка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...