private bool TryUntilSuccess(Action action) { const int tryCount = 100; var success = false; var currentTry = 0; while (!success) { try { action(); success = true; } catch (System.Runtime.InteropServices.COMException e) { currentTry++; _dialogsHelper.ChangeProgressText($"Формирование файла (попытка № {currentTry})..."); if (currentTry == tryCount) { return(false); } if ((e.ErrorCode & 0xFFFF) == 0xC472) { // Excel is busy Thread.Sleep(500); success = false; } else { Thread.Sleep(100); success = false; } } } return(true); }