我知道这可能会被标记为重复,但我看到了其他问题而他们并没有澄清我。 这是一个主题:
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 []
的列表当它抛出此异常时,我检查变量并没有错!
我做错了什么?
答案 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;