public CloseWindow(Form f)
        {
            InitializeComponent();
            ClosePage closePage = new ClosePage(f);

            closePage.OnClosed += ClosePage_OnClosed;;
            CloseFrame.Navigate(closePage);

            DataContext = Settings.Instance.Resources;
        }
Ejemplo n.º 2
0
        /// <summary>
        /// 从流中读取数据并保存到远端文件中。
        /// </summary>
        /// <exception cref="Exception"></exception>
        /// <returns></returns>
        public async Task ToStreamAsync(Stream stream, string file)
        {
            if (!Started)
            {
                Started = true;
                Size    = stream.Length;

                //发送请求
                OpenFrame frame = new OpenFrame()
                {
                    FileName = file,
                    FileSize = stream.Length,
                    ReadOnly = false,
                };
                base.GuidFilter = frame.Guid;
                await Send(frame).ConfigureAwait(false);

                //等待结果
                switch (await base.Answers.WaitAsync(Common.Configs.FrameTimeout).ConfigureAwait(false))
                {
                case OpenAnswerFrame answerFrame: break;

                case ErrorFrame errorFrame: throw new RemoteErrorException(errorFrame);

                default: throw new InvalidDataException();
                }

                //发送数据
                bool terminated = false;
                try
                {
                    const int sizeMax = 1024 * 128 < Configs.MaxFrameSize ? 1024 * 128 : Configs.MaxFrameSize;
                    const int sizeMin = 1024 < Configs.MaxFrameSize ? 1024 : Configs.MaxFrameSize;
                    int       size    = sizeMin;

                    byte[] buffer = new byte[sizeMax];
                    while (stream.Position != stream.Length)
                    {
                        long position = stream.Position;
                        int  count    = await stream.ReadAsync(buffer, 0, size).ConfigureAwait(false);

                        DataFrame dataFrame = new DataFrame(frame.Guid)
                        {
                            FileSize   = stream.Length,
                            DataOffset = position,
                            Data       = buffer.Take(count).ToArray(),
                        };

                        await Send(dataFrame).ConfigureAwait(false);

                        TransferedSize += count;

                        Recorder.Record(TransferedSize);
                        size = Math.Max(sizeMin, Math.Min(sizeMax, Common.Tools.SpeedRecorder.UpdateFrameSize((int)Recorder.SpeedPerSecond, size)));
                    }
                }
                catch (Exception ex)
                {
                    terminated = true;
                }

                //结束请求
                CloseFrame writeCloseFrame = new CloseFrame(frame.Guid);
                await Send(writeCloseFrame).ConfigureAwait(false);

                //等待结果
                switch (await base.Answers.WaitAsync().ConfigureAwait(false))
                {
                case CloseAnswerFrame answerFrame: break;

                case ErrorFrame errorFrame: throw new RemoteErrorException(errorFrame);

                default: throw new InvalidDataException();
                }

                if (terminated)
                {
                    throw new IOException();
                }
                Finished = true;
            }
        }