Тебе просто нужно добавить в условие проверки соответствующий тайм-аут. Например, это можно сделать так:
public class Checker {
const double _stdDelta = 10.0d;
Dictionary<string, DateTime> _dictionary = new Dictionary<string, DateTime>();
bool check( string input, double? delta = null ) {
if ( !_dictionary.ContainsKey( input ) ) {
_dictionary.Add( input, DateTime.Now );
return true;
}
var d = delta.HasValue ? delta.Value : _stdDelta;
if ( ( DateTime.Now - _dictionary[input] ).TotalSeconds > d ) {
_dictionary[input] = DateTime.Now;
return true;
}
return false;
}
public void CheckConditionByIfs( int condition ) {
if ( condition > 100 && check( "second_condition", 20.0d ) ) {
Console.WriteLine( "Second_condition met, custom timeout set." );
} else if ( condition > 20 && check( "first_condition" ) ) {
Console.WriteLine( "First_condition met, standard timeout set." );
} else {
Console.WriteLine( "Nothing." );
}
}
public void CheckConditionBySwitch( int condition ) {
switch ( condition ) {
case var _ when condition > 100 && check( "second_condition", 20.0d ):
Console.WriteLine( "Second_condition met, custom timeout set." );
return;
case var _ when condition > 20 && check( "first_condition" ):
Console.WriteLine( "First_condition met, standard timeout set." );
return;
}
Console.WriteLine( "Nothing." );
}
}
Пример использования:
var rnd = new Random();
var values = new int[] { 10, 15, 20, 25, 30, 35, 40, 50, 60, 70, 80, 100, 150, 200 };
var c = new Checker();
int cnd;
while ( true ) {
cnd = values[rnd.Next( values.Length )];
Console.WriteLine( cnd );
if ( rnd.Next( 100 ) > 50 )
c.CheckConditionBySwitch( cnd );
else
c.CheckConditionByIfs( cnd );
Thread.Sleep( 1500 );
}
Поясню. В C# 7.0 появилось зарождение Pattern Matching'а, который ты можешь наблюдать в
CheckConditionBySwitch (в плане логики выполнения он ничем не отличается от
CheckConditionByIfs, поэтому они потом выбираются случайно). По выходу C# 8.0 это будет вполне себе полноценный вариант, как в Nemerle, Kotlin или F#, поэтому к
switch и его новому синтаксису стоит присмотреться уже сейчас. Вообще, использование
Thread.Sleep для таймаута — дурной тон. Он неточен и выдаёт что-то примерно около, когда у системы появятся свободные ресурсы. Гораздо лучше воспользоваться каким-нить
TimeSpan, как таймером. Ну да ладно.
В данном примере условия для разных веток разделяются, путём назначения им по уникальному стринговому ключу текущей даты-времени (ключ может содержать, в принципе, что угодно). После этого для соотв. ключа ты проверяешь, не пришло ли время обновить значение по ключу и вернуть
true, для входа в ветку кода. Если у тебя однозначно ограниченные варианты, то, вероятно, стоило бы создать
enum, вместо
string и проверять\передавать уже его.