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