C# 对象引用未设置为对象的实例-使用列表
我知道这可能会被标记为重复,但我看到了其他问题,他们没有澄清我。 这在一个线程上:C# 对象引用未设置为对象的实例-使用列表,c#,C#,我知道这可能会被标记为重复,但我看到了其他问题,他们没有澄清我。 这在一个线程上: int indexOfList = 0; long byteSent = 0; byte[] chunkToSend; while(bytesThatAreCompressed != byteSent || !finished) { if (indexOfList < listOfChunksToSen
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是字节[]的列表
当它抛出这个异常时,我检查变量,没有任何错误
我做错了什么?我自己找到了答案 发生这种情况是因为线程之间存在混淆。此后,我添加了一个变量来存储列表的索引。因此,只有在流成功添加到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 ++;
}
}
发布所有相关代码并显示引发异常的行。您能翻译所有发生的变量吗?您正在初始化
indexOfList
,最后一行是indexDaLista++
。我们可以推断出它的意思,但我们不能确定。我已经更新了代码,经过一个小时的搜索,我发现了这个问题。我会把它写在答案里,它不是复制品!那个问题的答案真的很模糊!这是一个使用列表和不同线程的特定问题。向列表中添加项时,即使尚未添加数据,也会在开始时增加索引。因此,如果您使用不同的线程,它们将无法正常工作。这就是为什么必须使用变量来存储索引的原因。并在项目添加到列表后增加该变量!
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 ++;
}
}
listOfChunksToSend.Add(stream.ToArray());
lastAvailableIndex = listOfChunksToSend.Count - 1;