对象引用未设置为对象的实例 - 使用LIST

时间:2016-04-07 10:56:57

标签: c#

我知道这可能会被标记为重复,但我看到了其他问题而他们并没有澄清我。 这是一个主题:

        int indexOfList = 0;
        long byteSent = 0;
        byte[] chunkToSend;

        while(bytesThatAreCompressed != byteSent || !finished)
        {
            if (indexOfList < listOfChunksToSend.Count)
            {
                int testinteger = listOfChunksToSend[indexOfList ].Length;
                chunkToSend= new byte[testinteger];
                chunkToSend= listOfChunksToSend[indexOfList ];

                int tamanhoBufferComprimido = (int)chunkToSend.Length;
                byte[] tamanhoChunkB = BitConverter.GetBytes(tamanhoBufferComprimido);
                streamligacao.Write(tamanhoChunkB, 0, tamanhoChunkB.Length);

                streamligacao.Write(chunkToSend, 0, tamanhoBufferComprimido);
                byteSent += chunkToSend.Length;
                indexOfList ++;
            }
        }

这是另一个问题:

listOfChunksToSend.Add(stream.ToArray());   

它正在抛出这个例子:

  

对象引用未设置为对象的实例。

listOfChunksToSend是byte []

的列表

当它抛出此异常时,我检查变量并没有错!

我做错了什么?

1 个答案:

答案 0 :(得分:0)

我自己找到了答案..

由于线程之间的混淆,这种情况正在发生。我已经添加了一个变量来存储列表的索引。因此,只有在将流成功添加到byte []列表之后,索引才会递增。

更多解释: 这是使用列表和不同线程的特定问题。将项添加到列表时,即使尚未完成数据添加,它也会在开始时递增索引。因此,如果您使用不同的线程,它们将无法正常工作。这就是为什么必须使用变量来存储索引的原因。并在项目添加到列表后增加该变量!

代码更改:

主题1:

 int indexOfList = 0;
        long byteSent = 0;
        byte[] chunkToSend;

        while(bytesThatAreCompressed != byteSent || !finished)
        {
            if (indexOfList < lastAvailableIndex )
            {
                int testinteger = listOfChunksToSend[indexOfList ].Length;
                chunkToSend= new byte[testinteger];
                chunkToSend= listOfChunksToSend[indexOfList ];

                int tamanhoBufferComprimido = (int)chunkToSend.Length;
                byte[] tamanhoChunkB = BitConverter.GetBytes(tamanhoBufferComprimido);
                streamligacao.Write(tamanhoChunkB, 0, tamanhoChunkB.Length);

                streamligacao.Write(chunkToSend, 0, tamanhoBufferComprimido);
                byteSent += chunkToSend.Length;
                indexOfList ++;
            }
        }

主题2:

listOfChunksToSend.Add(stream.ToArray());   
lastAvailableIndex = listOfChunksToSend.Count - 1;