示例#1
0
        public void Start()
        {
            ThreadPool.QueueUserWorkItem((state) =>
            {
                try
                {
                    Info.State = ProcessState.CheckExists;
                    OnPropertChanged(nameof(State));

                    byte[] hash;
                    using (var hasher = MD5.Create())
                        using (var fileStream = FileInfo.OpenRead())
                        {
                            hash = hasher.ComputeHash(fileStream);
                            Info.FileInfo.Hash = hash;

                            OnPropertChanged(nameof(FileHash));
                            OnPropertChanged(nameof(ElapsedTime));

                            FileExistsResponse fileExists;
                            using (var client = new FileUploadClient())
                            {
                                fileExists = client.FileExists(new FileExistsRequest()
                                {
                                    FileInfo = Info.FileInfo,
                                });
                            }

                            if (fileExists.Result)
                            {
                                Info.Result  = ProcessResult.Error;
                                Info.State   = ProcessState.Completed;
                                Info.Message = "Файл был загружен раннее";

                                var reportBuilder = new StringBuilder();
                                reportBuilder.AppendLine("Файл был загружен раннее.");
                                if (fileExists.InProcess == null)
                                {
                                    reportBuilder.AppendLine("Информация о предыдущей загрузке не доступна");
                                }
                                else
                                {
                                    reportBuilder.AppendLine("Информация о предыдущей загрузке.");
                                    reportBuilder.AppendLine("Идентификатор: " + fileExists.InProcess.Id);
                                    reportBuilder.AppendLine("Файл: " + fileExists.InProcess.FileInfo.Name);
                                    reportBuilder.AppendLine("Состояние: " + fileExists.InProcess.State.ToString());
                                    reportBuilder.AppendLine("Результат: " + fileExists.InProcess.Result.ToString());
                                    reportBuilder.AppendLine("Сообщение: " + fileExists.InProcess.Message);
                                    reportBuilder.AppendLine("Время начала: " + fileExists.InProcess.StartTime.ToString());
                                    Info.Report = Encoding.UTF8.GetBytes(reportBuilder.ToString());
                                }

                                OnPropertChanged(nameof(Result));
                                OnPropertChanged(nameof(State));
                                OnPropertChanged(nameof(Message));
                                OnPropertChanged(nameof(ElapsedTime));
                            }
                            else
                            {
                                Info.State = ProcessState.Transfer;
                                OnPropertChanged(nameof(State));
                                OnPropertChanged(nameof(ElapsedTime));

                                var startProcessRequest        = new StartProcessRequest();
                                fileStream.Position            = 0L;
                                startProcessRequest.DataStream = fileStream;
                                startProcessRequest.StartInfo  = Info;

                                StartProcessResponse startProcessResponse;

                                using (var client = new FileUploadClient())
                                {
                                    startProcessResponse = client.StartProcess(startProcessRequest);
                                }

                                Info = startProcessResponse.ProcessInfo;

                                OnPropertChanged(nameof(Id));
                                OnPropertChanged(nameof(State));
                                OnPropertChanged(nameof(ElapsedTime));
                            }
                        }
                }
                catch (Exception e)
                {
                    //todo: WriteToLog


                    Info.State   = ProcessState.Completed;
                    Info.Result  = ProcessResult.Error;
                    Info.Message = "Возникла ошибка: " + e.Message;
                    Info.Report  = Encoding.UTF8.GetBytes(e.ToString());

                    OnPropertChanged(nameof(Result));
                    OnPropertChanged(nameof(State));
                    OnPropertChanged(nameof(Message));
                    OnPropertChanged(nameof(ElapsedTime));
                }
            });
        }