private Task<bool> CpuBoundOperation(CpuBoundOperationUi op) { return TaskEx.Run(() => { var timeToExit = Environment.TickCount + op.OperationTime; var i = 0; int currentTicks; while ((currentTicks = Environment.TickCount) < timeToExit) { if (op.WasCancelled) { return false; } if (i % UPDATE_FREQUENCY == 0) { DoUpdateOperationStatusAsync(op, 100 - (100 * (timeToExit - currentTicks)) / op.OperationTime); } ++i; } return true; }); }
private async void DoUpdateOperationStatusAsync(CpuBoundOperationUi op, int value) { await _guiSynchronizationContext.SwitchTo(); op.OnUpdate(value); }
private async Task LaunchCpuBoundOperationAsync(CpuBoundOperationUi op) { op.OnStarted(); bool wasCompleted = await CpuBoundOperation(op); if(wasCompleted) op.OnEnded(); else op.OnCancel(); }