//II.保存区块解析中断时的上下文状态
 public void saveBlockProcessContext()
 {
     if (countOfFileBlock(blockCountOfFile) != blockReadBlocksFromFile.Count)
     {
         Console.WriteLine("读取文件总数和区块池文件总数不一致");
     }
     else
     {
         record_OrphanBlock();
         fileStatusList.Clear();
         int readBlockPointer = 0;
         for (int i = 0; i < blockCountOfFile.Count; i++)
         {
             string        fileName        = get_filename(i);
             int           totalBlocks     = blockCountOfFile[i];
             int           unusedBlocks    = 0;
             List <string> unusedBlockHash = new List <string>();
             for (int j = 0; j < blockCountOfFile[i]; j++)
             {
                 if (blockReadBlocksFromFile[readBlockPointer] != null)
                 {
                     unusedBlockHash.Add(blockReadBlocksFromFile[readBlockPointer].Header.GetHash().ToString());
                     unusedBlocks++;
                 }
                 readBlockPointer++;
             }
             fileStatusList.Add(new FileStatusItem_Class(fileName, totalBlocks, unusedBlocks, unusedBlockHash));
         }
         string blockProcessContextFileFinalPath = Path.Combine(blockProcessContextFilePath, "BPC_" + processedBlockAmount + "_" +
                                                                lastProcessedBlockElement.Header.BlockTime.ToString("yyyy年MM月dd日HH时mm分ss秒") + ".dat");
         BlockProcessContextModel_Class blockProcessContextModel = new BlockProcessContextModel_Class(fileStatusList, forkedBlockList, orphanBlockList,
                                                                                                      lastProcessedBlockElement.Header.GetHash().ToString(), processedBlockAmount, blockReadPointer, currentLoadFileNumber,
                                                                                                      lastProcessedBlockElement.Header.BlockTime.DateTime);
         using (StreamWriter sw = File.CreateText(blockProcessContextFileFinalPath))
         {
             JsonSerializer serializer = new JsonSerializer();
             serializer.Serialize(sw, blockProcessContextModel);
         }
         Compress(blockProcessContextFileFinalPath, true);
     }
 }
        //l.从给定的BPC文件恢复程序状态
        public void restore_BlockProcessContextForProgram()
        {
            string blockProcessContextFileFinalPath = Path.Combine(blockProcessContextFilePath, blockProcessContextFileName);
            //判断给定文件名是压缩文件还是txt文件
            FileInfo fileName = new FileInfo(blockProcessContextFileFinalPath);

            if (fileName.Extension == ".rar")
            {
                Console.WriteLine("正在解压BPC下文状态文件......");
                Decompress(blockProcessContextFileFinalPath, false);
                blockProcessContextFileFinalPath = Path.Combine(blockProcessContextFilePath, Path.GetFileNameWithoutExtension(blockProcessContextFileFinalPath));
            }
            if (File.Exists(blockProcessContextFileFinalPath))
            {
                //1.反序列化BPC文件
                Console.WriteLine("开始提取程序上下文状态文件数据(BPC).........");
                BlockProcessContextModel_Class blockProcessContextModelObject = null;
                Stopwatch timer = new Stopwatch();
                timer.Start();
                try
                {
                    using (StreamReader sr = File.OpenText(blockProcessContextFileFinalPath))
                    {
                        JsonSerializer jsonSerializer = new JsonSerializer();
                        blockProcessContextModelObject = jsonSerializer.Deserialize(sr, typeof(BlockProcessContextModel_Class)) as BlockProcessContextModel_Class;
                    }
                }
                catch (Exception e)
                {
                    Console.WriteLine(e.Message);
                    Console.WriteLine("BPC文件保存不完整或已经损坏。该错误可能是由于在保存BPC文件时提前终止程序造成的,或是人为修改了最近的BPC文件。");
                }
                timer.Stop();
                Console.WriteLine("提取结束,反序列化切片用时:" + timer.Elapsed);
                //2.恢复区块池
                Console.WriteLine("开始恢复区块池.........");
                Stopwatch timer1 = new Stopwatch();
                timer1.Start();
                restore_blockReadBlocksFromFile(blockProcessContextModelObject.fileStatusList);
                timer1.Stop();
                Console.WriteLine("恢复区块池用时:" + timer1.Elapsed);
                //3.恢复参数
                forkedBlockList       = blockProcessContextModelObject.forkedBlockList;
                orphanBlockList       = blockProcessContextModelObject.orphanBlockList;
                blockReadPointer      = blockProcessContextModelObject.blockReadPointer;
                currentLoadFileNumber = blockProcessContextModelObject.currentLoadFileNumber;
                processedBlockAmount  = blockProcessContextModelObject.processedBlockAmount;
                recentlySliceDateTime = blockProcessContextModelObject.blockProcessContextDatetime;
                blockProcessContextModelObject.Dispose();
                //4.恢复队列池
                Console.WriteLine("开始恢复区块队列.........");
                Stopwatch timer2 = new Stopwatch();
                timer2.Start();
                ParserBlock queueBlock;
                if ((queueBlock = restore_QueueHeaderBlock(blockProcessContextModelObject.lastProcessedBlockHash)) != null)
                {
                    initialize_BlockQueuePooling(queueBlock);
                }
                else
                {
                    Console.WriteLine("队首区块未找到,恢复失败!!!");
                }
                timer2.Stop();
                Console.WriteLine("恢复区块队列用时:" + timer2.Elapsed);
                Console.WriteLine("BPC上下文状态恢复成功.........");
                File.Delete(blockProcessContextFileFinalPath);//删除解压后的文件BPC文件
            }
            else
            {
                Console.WriteLine(blockProcessContextFileFinalPath + " 文件不存在!!!");
            }
        }