我有这段代码,它给了我一个错误:
目标数组的长度不足以复制集合中的所有项。请检查数组索引和长度。
我认为这是因为使用了字典,所以我将其切换到 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();
}
UPD:
目标数组长度不足以复制集合中的所有项。请检查数组索引和长度。并且在System.ThrowHelper.ThrowArgumentException(ExceptionResource resource)处、在System.Collections.Generic.Dictionary`2.CopyTo(KeyValuePair`2[] array, Int32 index)处、在System.Collections.Generic.Dictionary`2.GetObjectData(SerializationInfo info, StreamingContext context)处抛出。在System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitSerialize(Object obj, ISurrogateSelector surrogateSelector, StreamingContext context, SerObjectInfoInit serObjectInfoInit, IFormatterConverter converter, ObjectWriter objectWriter, SerializationBinder binder)处,在System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Write(WriteObjectInfo objectInfo, NameInfo memberNameInfo, NameInfo typeNameInfo)处,在System.Runtime.Serialization.Formatters.Binary.ObjectWriter.WriteArrayMember(WriteObjectInfo objectInfo, NameInfo arrayElemTypeNameInfo, Object data)处,在System.Runtime.Serialization.Formatters.Binary.ObjectWriter.WriteArray(WriteObjectInfo objectInfo, NameInfo memberNameInfo, WriteObjectInfo memberObjectInfo)处,在System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Write(WriteObjectInfo objectInfo, NameInfo memberNameInfo, NameInfo typeNameInfo)处抛出。在System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Serialize(Object graph, Header[] inHeaders, __BinaryWriter serWriter, Boolean fCheck)处,AggregateRunner.Enteties.Saver.SaverCallback()。
goto
,它表示主要的设计问题。唯一允许跳转的语言是IL和ASM。 - Sebastian LJobQueue.Queue.MainQueue
和JobQueue.Queue.LockedQueue
的类型是什么? - Matthew Watsonmilestone
序列化的过程中,另一个线程是否可以向作业队列添加项目?如果是这样,可能在该过程中会发生一些不良情况。 - Matthew Watson