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();
        }