值不能为空。参数名称:dest

Posted

技术标签:

【中文标题】值不能为空。参数名称:dest【英文标题】:Value cannot be null. Parameter name: dest 【发布时间】:2019-10-29 00:09:31 【问题描述】:

我有一个将一些文本数据写入压缩文本文件的小应用程序。它适用于第一个存档,但一段时间后我得到以下未处理的异常:

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

我添加了&& line.Lenght >0,因为我认为这可能是问题所在,但没有任何改变。 我在 3 小时内获得了 1 个完整存档,有时是第二个的一半,我想它还没有完成,而是以 .tmp 扩展名写入磁盘。我可以将其重命名为 zip 并打开/解压缩/读取数据。 如果我将“计数器”更改为更小的时间段,例如10分钟,它写了一堆档案,好像一切都很好。足以让我认为这个错误已经消失了。 所以这个错误可能会在大约 4-5 小时后发生。 如何解决这个问题?

堆栈跟踪:

[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");
    

【问题讨论】:

仅供参考if (line != null &amp;&amp; line.Length &gt; 0) -> if (!string.IsNullOrEmpty(line)) 所以....您实际上想要做什么,因为这可能是错误(或可疑)的方法 @TheGeneral 我正在从不同的线程中收集字符串行。我希望在将它们添加到队列时将它们逐行写入 zip 文件中。我想把这个分成 n 小时的档案。 @TheGeneral 我知道这段代码可以稍微优化一下,比如在循环之外移动counterstart。我试图检查导致错误的原因。 hmm .. 这很有趣,因为这个异常是从那里的内存流中引发的......我不认为你的代码示例真的会导致异常.. 它似乎与流有关本身被丢弃。可能对 ZipArchiveEntry.. 进行流处理。在单独的产品 github bug board 上也出现了类似的问题,但那里没有太多帮助。 【参考方案1】:

更改 ZIP 库解决了我的问题。我已将 Microsoft System.IO.Compression 更改为 ICSharpCode.SharpZipLib。代码几乎相同。现在一切正常。微软库中似乎有错误。

【讨论】:

以上是关于值不能为空。参数名称:dest的主要内容,如果未能解决你的问题,请参考以下文章

System.ArgumentNullException: '值不能为空。参数名称:输入'Xamarin?

值不能为空。参数名称:编码器[重复]

值不能为空。参数名称:httpContext

值不能为空。参数名称:starter中的connectionString appsettings.json

使用 DAL2 访问数据:值不能为空。参数名称:con

值不能为空。参数名称:routeCollection + ApiController