برای طراحی یک سیسم پایدار همواره باید بتوانید نسبت به خطاها و اتفاقات ناخواسته رفتار مشخصی را در برنامه خود داشته باشید. از این رو استراتژیهای متفاوتی از جمله timeout، retry، fallback و ... وجود دارند.
حال در برنامه شما نیز یک کلاس به نام `Avalanche` وجود دارد که وظیفه مدیریت این قابلیتها را بر عهده گرفته است و شما وظیفه دارید این قابلیتها را پیادهسازی کنید.
# نکات
1. برای دانلود فایل پروژه بر روی [این لینک](/problemset/assignments/4367/download_problem_initial_project/197315/) کلیک کنید
2. **مهلت زمانی - Timeout:** در این تابع شما باید کدی را توسعه دهید که یک عملیات را با یک مهلت زمانی مشخص دریافت کند. در صورتی که اجرای عملیات کمتر از مهلت زمانی به طول انجامید تابع مقدار `true` و در غیر این صورت مقدار `false` را برگرداند.
```csharp
bool ExecuteWithTimeout(Action operation, int timeoutMilliseconds)
```
3. **تلاش مجدد - Retry:** در این تابع شما کدی را توسعه میدهید که برای اجرای عملیات به تعداد دفعات دادهشده در فواصل زمانی مشخص و ثابت تلاش میشود. در صورتی که عملیات با موفقیت اجرا شود تابع مقدار `true` و در غیر اینصورت مقدار `false` بر خواهد گرداند.
```csharp
bool RetryOperation(Action operation, int maxRetries, int retryIntervalMs)
```
4. **پشتیبانی - Fallback:** در این تابع شما همزمان با عملیات اصلی یک عملیات پشتیبان دریافت خواهید نمود تا در صورت خطای در اجرای عملیات اصلی عملیات پشتیبان را اجرا نمایید. هر دو عملیات خروجی متفاوتی خواهند داشت.
```csharp
string ExecuteWithFallback(Func<string> primaryOperation, Func<string> fallbackOperation)
```