Ejemplo n.º 1
0
 private static void SavePage(string folder, int pageIndex, Stream content, CancelToken token, Progress g)
 {
     if (token.IsCanceled)
     {
         return;
     }
     lock (_syncObject)
     {
         string fileName = Path.Combine(folder, GetPageName(pageIndex + 1));
         IOUtil.Delete(fileName);
         using (var fs = new FileStream(fileName, FileMode.Create, FileAccess.Write, FileShare.None))
         {
             content.Seek(0, SeekOrigin.Begin);
             using (var temp = SegmentReaderSlim.Borrow(SegmentSize.KB128))
             {
                 var reader = temp.Item;
                 reader.Read(content, (seg) =>
                 {
                     var bytes = seg.GetContent();
                     fs.Write(bytes, 0, bytes.Length);
                     if (token.IsCanceled)
                     {
                         return(false);
                     }
                     return(true);
                 });
             }
         }
     }
 }
Ejemplo n.º 2
0
        private void ReadBy128BufferSizeSlim(int contentSize)
        {
            var content   = GetBytes(contentSize);
            var blockSize = SegmentSize.Byte128.Value;
            var maxIndex  = contentSize / blockSize;

            using (MemoryStream ms = new MemoryStream(content))
            {
                using (var temp = SegmentReaderSlim.Borrow(SegmentSize.Byte128))
                {
                    var reader = temp.Item;
                    int index  = 0;
                    reader.Read(ms, (seg) =>
                    {
                        //对比数据
                        byte[] source = null;
                        if (index == maxIndex)
                        {
                            var offset = blockSize * index;
                            var retain = contentSize - offset;
                            source     = new byte[retain];
                            Buffer.BlockCopy(content, offset, source, 0, retain);
                        }
                        else
                        {
                            source     = new byte[blockSize];
                            var offset = blockSize * index;
                            Buffer.BlockCopy(content, offset, source, 0, blockSize);
                        }

                        var target = seg.GetContent();
                        Assert.IsTrue(target.SequenceEqual(source));

                        index++;
                        return(true);
                    });
                    Assert.AreEqual(index, maxIndex + 1);
                    Assert.AreEqual(ms.Position, ms.Length);
                }
            }
        }
Ejemplo n.º 3
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="info"></param>
        /// <param name="stream"></param>
        /// <param name="dataLength">需要上传的总数据长度,不是每种流都支持length属性,所以需要额外的指定</param>
        public void Save(DTObject info, Stream stream, long dataLength, Action <DTObject, Progress> callback, CancelToken token)
        {
            try
            {
                _info = info;
                _info["requestId"] = Guid.NewGuid();
                _token             = token;

                _callback = callback;
                long completedLength = 0;
                using (var temp = SegmentReaderSlim.Borrow(SegmentSize.GetAdviceSize(dataLength)))
                {
                    var reader = temp.Item;
                    reader.Read(stream, (seg) =>
                    {
                        var content    = seg.GetContent();
                        bool sent      = false;
                        bool completed = UseClient((client) =>
                        {
                            var msg = CreateSaveMessage(_info, content);
                            _future = new Future <bool>(); //使用该对象监视进度
                            _future.Start();
                            client.Send(msg);
                            sent    = _future.Result;
                            _future = null;
                        });

                        if (_token.IsCanceled)
                        {
                            //取消
                            UseClient((client) =>
                            {
                                var msg = CreateCancelSaveMessage(_info);
                                client.Send(msg);
                            });
                            return(false);
                        }

                        if (_error != null)
                        {
                            return(false);
                        }

                        if (completed && sent)
                        {
                            completedLength += content.Length;
                            callback(_info, new Progress(dataLength, completedLength, content.Length));
                            return(true);
                        }
                        return(false);
                    });
                }

                if (_error != null)
                {
                    throw new ApplicationException(_error);
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                ClearUp(); //全部执行完毕后清理
            }
        }