gpt4 book ai didi

c# - 目标数组的长度不足以复制集合中的所有项目。检查数组索引和长度

转载 作者:太空宇宙 更新时间:2023-11-03 12:30:27 24 4
gpt4 key购买 nike

我有这个代码。它给了我一个错误:

Destination array is not long enough to copy all the items in the collection. Check array index and length.

我以为是因为用了字典,所以改成ConcurrentDictionary,结果还是报错。

private void SaverCallback()
{
AddThread("Main Thread");
const string path = "milestone";
while (!stop)
{
ConcurrentDictionary<string, object> milestone = new ConcurrentDictionary<string, object>();
milestone.TryAdd("Jobs", JobQueue.Queue.MainQueue);
milestone.TryAdd("Locked Jobs", JobQueue.Queue.LockedQueue);

again: try {
using (FileStream writingStream = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Write, FileShare.None))
{
BinaryFormatter formater = new BinaryFormatter();
formater.Serialize(writingStream, milestone);
writingStream.Flush();
Logger.Debug("Status saved");
}
}
catch(Exception e)
{
Logger.Error($"Milestone exception: {e.Message}");
goto again;
}
this.WaitTime(60000);
}
RemoveThread();
}

更新:

Destination array is not long enough to copy all the items in the collection. Check array index and length. and at System.ThrowHelper.ThrowArgumentException(ExceptionResource resource) at System.Collections.Generic.Dictionary2.CopyTo(KeyValuePair2[] array, Int32 index) at System.Collections.Generic.Dictionary`2.GetObjectData(SerializationInfo info, StreamingContext context) at System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitSerialize(Object obj, ISurrogateSelector surrogateSelector, StreamingContext context, SerObjectInfoInit serObjectInfoInit, IFormatterConverter converter, ObjectWriter objectWriter, SerializationBinder binder) at System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Write(WriteObjectInfo objectInfo, NameInfo memberNameInfo, NameInfo typeNameInfo) at System.Runtime.Serialization.Formatters.Binary.ObjectWriter.WriteArrayMember(WriteObjectInfo objectInfo, NameInfo arrayElemTypeNameInfo, Object data) at System.Runtime.Serialization.Formatters.Binary.ObjectWriter.WriteArray(WriteObjectInfo objectInfo, NameInfo memberNameInfo, WriteObjectInfo memberObjectInfo) at System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Write(WriteObjectInfo objectInfo, NameInfo memberNameInfo, NameInfo typeNameInfo) at System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Serialize(Object graph, Header[] inHeaders, __BinaryWriter serWriter, Boolean fCheck)
at System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize(Stream serializationStream, Object graph, Header[] headers, Boolean fCheck)
at AggregateRunner.Enteties.Saver.SaverCallback()

最佳答案

据我所知,您每小时为您的队列拍摄一次快照,但您的代码的主要问题是您正在尝试序列化您的队列(我想这是一个 ConcurrentQueue<T> ) ) 本身没有任何克隆或同步逻辑。您的代码的另一个问题是 goto用法,这里根本没有必要。

您遇到的异常是 ArgumentException并且是 third possible exceptionCopyTo ConcurrentQueue<T> 的方法.它发生在序列化期间,因为某些线程将一些消息添加到队列中,现在它不适合数组序列化程序决定使用。

因此,在这种情况下您可以做的是在访问原始队列期间引入一些锁定(您决定这样做),或者为您的队列创建一个克隆并以安全的方式序列化它而不阻塞其他队列线程。

您可以使用 CopyTo 执行此操作ConcurrentQueue<T>的方法|自己创建长度大于队列中消息数的数组,但锁定通常是克隆数据的更方便的方法。所以你的代码应该是这样的:

private void SaverCallback()
{
AddThread("Main Thread");
const string path = "milestone";
while (!stop)
{
try
{
lock (JobQueue.Queue.MainQueue)
lock (JobQueue.Queue.LockedQueue)
{
using (var writingStream = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Write, FileShare.None))
{
var milestone = new ConcurrentDictionary<string, object>();
milestone.TryAdd("Jobs", JobQueue.Queue.MainQueue);
milestone.TryAdd("Locked Jobs", JobQueue.Queue.LockedQueue);

var formater = new BinaryFormatter();
formater.Serialize(writingStream, milestone);
writingStream.Flush();
Logger.Debug("Status saved");
}
}
// this line cloud be in finally case too,
// if you don't need to save a queue in case of some errors
this.WaitTime(60000);
}
catch(Exception e)
{
// note that logger accepts whole exception information
// instead of only it's message
Logger.Error($"Milestone exception: {e}");
continue;
}
}
RemoveThread();
}

关于c# - 目标数组的长度不足以复制集合中的所有项目。检查数组索引和长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43041839/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com