public BackupProgressEventArgs(OperationProgressDetails details, long bytesPending, long bytesComplete, int operationsPending, int operationsComplete) { this.OperationDetails = details; this.BytesPending = bytesPending; this.BytesComplete = bytesComplete; this.OperationsPending = operationsPending; this.OperationsComplete = operationsComplete; }
private void Manager_ProgressMade(object sender, OperationProgressDetails progress) { BackupProgressEventArgs args = new BackupProgressEventArgs(progress, manager.BytesPending, manager.BytesProcessed, manager.OperationsPending, manager.OperationsProcessed); OnBackupProgress(args); if (scanComplete && manager.OperationsPending == 0) { manager.Dispose(); OnComplete(); } }
private void Worker_ProgressMade(object sender, OperationProgressDetails progress) { if (progress.Completed) { ((OperationWorker)sender).Dispose(); OnComplete(); } else { OnBackupProgress(new BackupProgressEventArgs(progress, progress.BytesPending, progress.BytesProcessed, 1, 0)); } }
private void ProcessOperation(IOOperation operation) { lock (statLock) bytesPending -= operation.EffectiveFileSize; try { //Copy operations get some special callbacks and tracking OngoingOperation progressOp = operation as OngoingOperation; if (progressOp != null) { IOProgressCallback copyCall = new IOProgressCallback((pending, transferred, sourceFile, destinationFile) => { OperationProgressDetails details = new OperationProgressDetails(operation, transferred, pending); activeOperations[operation] = details; OnProgress(details); //TODO: potentially add in-file pause to this? Right now we only support one in-file operation: cancel. if (State == OperationState.Terminated) return IOProgressResult.PROGRESS_CANCEL; else return IOProgressResult.PROGRESS_CONTINUE; }); progressOp.DoOperation(copyCall); } else { operation.DoOperation(); } } catch (Exception e) //We're catching everything (*gasp!*) so we can bubble it up without blowing up stacks of threads. { OnProgress(new OperationProgressDetails(operation, e)); } finally { lock(statLock) { if (operation.EffectiveFileSize > 0 && activeOperations.ContainsKey(operation)) activeOperations.Remove(operation); bytesProcessed += operation.EffectiveFileSize; operationsProcessed += 1; } //Notify the caller that the operation has completed OnProgress(new OperationProgressDetails(operation, true)); } }
private void OnProgress(OperationProgressDetails details) { OperationProgressHandler handler; lock (eventLock) { handler = progressHandler; } if (handler != null) { handler(this, details); } }
private void Worker_ProgressMade(object sender, OperationProgressDetails progress) { OnProgress(progress); }