//========================================================================================= // //========================================================================================= 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; } }
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; } }