예제 #1
0
        //=========================================================================================
        //
        //=========================================================================================
        private void OnDownloadWorkerDoWork(object sender, DoWorkEventArgs e)
        {
            BackgroundWorker worker = sender as BackgroundWorker;

            using (DownloadHelper helper = (DownloadHelper)e.Argument)
            {
                try
                {
                    int iterations = 0;
                    int maxsize    = 0;
                    int chunksize  = 16 * 1024;

                    helper.beginTime     = DateTime.Now;
                    helper.numberOfFiles = this.filelistGridView.RowCount;

                    for (int i = 0; i < helper.numberOfFiles; i++)
                    {
                        DataRow row = this.filelistGridView.GetDataRow(i);

                        AppMediator.SINGLETON.Ping();

                        helper.fileNumber   = i + 1;
                        helper.fileName     = row["rname"].ToString();
                        helper.virtualName  = row["guid"].ToString() + ".bin";
                        helper.dnloadDay    = Convert.ToDateTime(row["wdate"]);
                        helper.saveFileName = Path.Combine(helper.savePath, helper.fileName);

                        FileInfo fileInfo = new FileInfo(helper.saveFileName);

                        DialogResult dialogResult = DialogResult.Yes;

                        if (fileInfo.Exists == true)
                        {
                            dialogResult = MessageBox.Show("[" + helper.fileName + "] overwrite?", "confirm", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                        }

                        if (dialogResult != DialogResult.Yes)
                        {
                            helper.statusMessage = "skipped";
                            worker.ReportProgress(helper.percentProgrss, helper as object);

                            continue;
                        }

                        if (File.Exists(helper.saveFileName) == true)
                        {
                            if (helper.CheckFileHash() == true)
                            {
                                helper.statusMessage = "완료됨";
                                worker.ReportProgress(helper.percentProgrss, helper as object);

                                continue;
                            }

                            File.Create(helper.saveFileName).Close();
                        }

                        if (AppMediator.SINGLETON.PrepareDownloadFile(helper.dnloadDay, helper.virtualName, out helper.fileSize, out maxsize) == false)
                        {
                            helper.statusMessage = "canceled";
                            worker.ReportProgress(helper.percentProgrss, helper as object);

                            continue;
                        }

                        helper.fileReadSize = 0;

                        using (FileStream stream = new FileStream(helper.saveFileName, FileMode.Append, FileAccess.Write))
                        {
                            while (helper.fileReadSize < helper.fileSize)
                            {
                                if (worker.CancellationPending == true)
                                {
                                    break;
                                }

                                if (iterations == DownloadHelper.AVERAGE_COUNT)
                                {
                                    long timeForInitChunks = (long)DateTime.Now.Subtract(helper.beginTime).TotalMilliseconds;
                                    long averageChunkTime  = Math.Max(1, timeForInitChunks / DownloadHelper.AVERAGE_COUNT);

                                    chunksize = (int)Math.Min(maxsize, chunksize * DownloadHelper.PREFERRED_TRANSFER_DURATION / averageChunkTime);
                                }

                                try
                                {
                                    byte[] buffer = AppMediator.SINGLETON.DownloadFile(helper.dnloadDay, helper.virtualName, helper.fileReadSize, chunksize);

                                    if (buffer.Length < 1)
                                    {
                                        break;
                                    }

                                    stream.Write(buffer, 0, buffer.Length);

                                    helper.fileReadSize  += buffer.Length;
                                    helper.totalReadSize += buffer.Length;
                                }
                                catch (Exception ex)
                                {
                                    if (helper.NumRetries++ < helper.MaxRetries)
                                    {
                                    }
                                    else
                                    {
                                        stream.Close();
                                        throw new Exception(String.Format("Error occurred during download {0}, too many retries.", ex.Message));
                                    }
                                }

                                helper.statusMessage = "transferring";
                                worker.ReportProgress(helper.percentProgrss, helper as object);

                                iterations++;
                            }

                            stream.Close();

                            if (worker.CancellationPending == true)
                            {
                                break;
                            }

                            if (helper.CheckFileHash() == true)
                            {
                                AppMediator.SINGLETON.CloseDownloadFile(helper.dnloadDay, helper.virtualName);

                                helper.statusMessage = "완료됨";
                                worker.ReportProgress(helper.percentProgrss, helper as object);
                            }
                        }
                    }

                    if (worker.CancellationPending == false && e.Cancel == false)
                    {
                        e.Result = helper as object;
                        e.Cancel = false;
                        return;
                    }
                }
                catch (Exception ex)
                {
                    OFileLog.SNG.WriteLog(ex.ToString());
                }

                helper.statusMessage = "stopped";
                worker.ReportProgress(helper.percentProgrss, helper as object);

                if (File.Exists(helper.saveFileName) == true)
                {
                    File.Delete(helper.saveFileName);
                }

                e.Cancel = true;
                return;
            }
        }
예제 #2
0
        private void OnDownloadWorkerDoWork(object sender, DoWorkEventArgs e)
        {
            BackgroundWorker _worker = sender as BackgroundWorker;

            using (DownloadHelper _helper = (DownloadHelper)e.Argument)
            {
                try
                {
                    int iterations = 0;
                    int maxsize    = 0;
                    int chunksize  = 16 * 1024;

                    e.Cancel = true;

                    _helper.beginTime = DateTime.Now;

                    AppMediator.SINGLETON.Ping();

                    if (AppMediator.SINGLETON.PrepareDownloadFile(_helper.dnloadDay, _helper.virtualName, out _helper.fileSize, out maxsize) == true)
                    {
                        if (File.Exists(_helper.saveFileName) == true)
                        {
                            if (_helper.CheckFileHash() == true)
                            {
                                _helper.totalReadSize = _helper.fileSize;
                                _helper.statusMessage = "completed";
                                _worker.ReportProgress(_helper.percentProgrss, _helper as object);

                                e.Result = _helper as object;
                                e.Cancel = false;
                                return;
                            }

                            File.Create(_helper.saveFileName).Close();
                        }

                        using (FileStream stream = new FileStream(_helper.saveFileName, FileMode.Append, FileAccess.Write))
                        {
                            while (_helper.totalReadSize < _helper.fileSize)
                            {
                                if (_worker.CancellationPending == true)
                                {
                                    break;
                                }

                                if (iterations == DownloadHelper.AVERAGE_COUNT)
                                {
                                    long timeForInitChunks = (long)DateTime.Now.Subtract(_helper.beginTime).TotalMilliseconds;
                                    long averageChunkTime  = Math.Max(1, timeForInitChunks / DownloadHelper.AVERAGE_COUNT);

                                    chunksize = (int)Math.Min(maxsize, chunksize * DownloadHelper.PREFERRED_TRANSFER_DURATION / averageChunkTime);
                                }

                                try
                                {
                                    byte[] buffer = AppMediator.SINGLETON.DownloadFile(_helper.dnloadDay, _helper.virtualName, _helper.totalReadSize, chunksize);

                                    if (buffer.Length < 1)
                                    {
                                        break;
                                    }

                                    stream.Write(buffer, 0, buffer.Length);
                                    _helper.totalReadSize += buffer.Length;
                                }
                                catch (Exception ex)
                                {
                                    if (_helper.NumRetries++ < _helper.MaxRetries)
                                    {
                                        // swallow the exception and try again
                                    }
                                    else
                                    {
                                        stream.Close();
                                        throw new Exception(String.Format("Error occurred during download {0}, too many retries.", ex.Message));
                                    }
                                }

                                _helper.statusMessage = "downloading";
                                _worker.ReportProgress(_helper.percentProgrss, _helper as object);

                                iterations++;
                            }

                            stream.Close();

                            if (_worker.CancellationPending == false)
                            {
                                if (_helper.CheckFileHash() == true)
                                {
                                    AppMediator.SINGLETON.CloseDownloadFile(_helper.dnloadDay, _helper.virtualName);

                                    _helper.statusMessage = "completed";
                                    _worker.ReportProgress(_helper.percentProgrss, _helper as object);

                                    e.Cancel = false;
                                }
                            }
                        }
                    }

                    if (_worker.CancellationPending == false && e.Cancel == false)
                    {
                        e.Result = _helper as object;
                        e.Cancel = false;
                        return;
                    }
                }
                catch (Exception ex)
                {
                    OFileLog.SNG.WriteLog(ex.ToString());
                }

                _helper.statusMessage = "canceled";
                _worker.ReportProgress(_helper.percentProgrss, _helper as object);

                if (File.Exists(_helper.saveFileName) == true)
                {
                    File.Delete(_helper.saveFileName);
                }

                e.Cancel = true;
                return;
            }
        }