Catrobat.IDE.Core.ViewModels.Main.MainViewModel.DeleteProgram C# (CSharp) Method

DeleteProgram() private method

private DeleteProgram ( string programNameToDelete ) : System.Threading.Tasks.Task
programNameToDelete string
return System.Threading.Tasks.Task
        private async Task DeleteProgram(string programNameToDelete)
        {
            DateTime deleteStartTime;

            lock (_programsToDelete)
            {
                if (_localPrograms.All(program =>
                    program.ProjectName != programNameToDelete))
                    return;

                var programToDelete = _localPrograms.FirstOrDefault(program =>
                    program.ProjectName == programNameToDelete);

                if (programToDelete == null ||
                    _programsToDelete.Contains(programNameToDelete))
                    return;

                _programsToDelete.Add(programNameToDelete);
                programToDelete.IsDeleting = true;
                deleteStartTime = DateTime.UtcNow;

                _programsToDelete.Add(programNameToDelete);

                if (_isDeleting)
                    return;

                _isDeleting = true;
            }

            while (true)
            {
                List<string> programNames = null;
                lock (_programsToDelete)
                {
                    if (_programsToDelete.Count == 0)
                    {
                        _isDeleting = false;
                        break;
                    }

                    programNames = new List<string>(_programsToDelete);
                    _programsToDelete.Clear();
                }

                foreach (var programName in programNames)
                {
                    if (CurrentProgram != null && CurrentProgram.Name == programName)
                    {
                        var programChangedMessage = new GenericMessage<Program>(null);
                        Messenger.Default.Send(programChangedMessage, 
                            ViewModelMessagingToken.CurrentProgramChangedListener);
                    }

                    using (var storage = StorageSystem.GetStorage())
                    {
                        await storage.DeleteDirectoryAsync(Path.Combine(
                            StorageConstants.ProgramsPath, _deleteProgramName));
                    }
                }

                var minDeleteTime = new TimeSpan(0, 0, 2);
                var remainingDeleteTime = minDeleteTime.Subtract(
                    DateTime.UtcNow.Subtract(deleteStartTime));

                if (remainingDeleteTime > new TimeSpan(0))
                    await Task.Delay(remainingDeleteTime);
                await UpdateLocalPrograms();
            }
        }