2016-11-21 5 views
2

Существует функция, которая проверяет лицензию с помощью аппаратного ключа. Но эта функция вызывается слишком часто и требует времени для выполнения. Поэтому, чтобы избежать слишком большого количества звонков, я хочу проверить лицензию на некоторое время.Как часто вызывать функцию, вызываемую слишком часто

bool CheckLicense() 
{ 
    if(license checked in last 10 secconds) 
    { 
     return last status; 
    } 
    else 
    { 
     hardware access for license check 
     return current status 
    } 
} 

Редактировать: Ключ оборудования может быть удален, поэтому проверка один раз не является хорошей практикой. Также требуется лицензионная проверка для включения и отключения статуса отдельной кнопки.

+0

Следует ли проверять лицензию каждые 10 секунд (максимум) или проверять ее один раз и кэшировать результат достаточно? –

+1

Недостаточно ли проверять статус один раз в программе? Тогда вы можете установить состояние в начале. – naro

+0

Почему бы не использовать таймер? –

ответ

8

В общем, я думаю, вам понадобится нечто подобное.

private DateTime lastCheckTime = DateTime.Now.AddDays(-1); 

bool CheckLicense() 
{ 
    if (lastCheckTime.AddSeconds(10) < DateTime.Now) 
    { 
     return last status; 
    } 
    else 
    { 
     lastCheckTime = DateTime.Now; 

     // hardware access for license check 
     return current status 
    } 
} 
+1

Это действительно простое и легкое решение. Благодарю. –

+2

@RohanSD отметьте его ответ как правильный, если помогли! – mybirthname

0

Если вы хотите назвать это только один раз каждые 10 секунд, вы можете использовать следующее:

bool CheckLicense() 
{ 
    bool currentStatus = false; 

    //hardware access for license check 

    new Thread(() => 
    { 
     Thread.Sleep(10000); 
     CheckLicense(); 
     }).Start(); 

    return currentStatus; 
} 

Вы называете это один раз в вашем коде, а затем через каждые 10 секунд, он будет называть себя.

+0

Нет, я не хочу вызывать функцию каждые 10 секунд. Проверка лицензии должна выполняться только при необходимости. –

+1

Хорошо, тогда @ Хакам дал вам правильный ответ;) –

0

Проверка лицензии каждые 10 секунд обязательно добавит ко многим вызовам для той же функции. Вы можете сделать это один раз, когда программа запускается в соответствии с рекомендациями в комментариях, тогда как если вам действительно необходимо проверить лицензию или вызвать функцию через какое-то время, вы можете фактически увеличить тайминги, чтобы вы знали, что вы проверили лицензию и вызовы будут сокращены.

Как, например, вы проверили лицензию в первый раз, когда программа запускается, а затем примерно на 10 секунд, а затем увеличьте время на 10*2, что будет 20, чем в следующий раз увеличьте его на 20*2, который станет 40, и это уменьшится вызов, а также вы будете проверять его каждые несколько раз.

bool CheckLicense() 
{ 
    timelimit = 300; 
    if(seconds > timetocheck) 
    { 
     return last status; 
     timetocheck *= 2; 
     if(timetocheck >= timelimit) 
     { 
      timetocheck = 10; 
     } 
    } 
    else 
    { 
     hardware access for license check 
     return current status 
    } 
} 

Программа только прототип и не значит бежать прямо это и не говорить о типах данных и синтаксиса. Это просто для понимания способности.

+0

Идея хорошая. Но я должен вызвать эту функцию для включения кнопок отключения, поэтому, если я продолжаю увеличивать время за очень короткое время, он достигнет дней и лет. –

+0

Вы можете пометить предел 5 минут или 10 минут соответственно. См. Правление –

0

Если вы делаете это, синхронизация выполняется. код. Вместо этого вы можете запустить новый поток. И если есть проблемы с лицензией, отдельный поток будет сообщать вашу основную тему через события:

class LicenseChecker 
{ 
    private Timer mTimer; 
    public delegate void LicenseNotValidDelegate(); 
    public event LicenseNotValidDelegate LicenseNotValid; 

    public LicenseChecker() 
    { 
     mTimer = new Timer(); 
     mTimer.Ticket += mTimer_Tick; 
     mTimer.Interval = TimeSpan.FromSeconds(10); 
    } 

    public void Start() 
    { 
     mTimer.Start(); 
    } 

    void mTimer_Tick(object sender, EventArgs e) 
    { 
     if(!CheckLicense()) 
      LicenseNotValid?.Invoke(); 
    } 

    private bool CheckLicense() 
    { ... } 
} 

... 
public void Main() 
{ 
    var lLC = new LicenseChecker(); 
    lLC.LicenseNotValid += lLC_LicenseNotValid; 
    lLC.Start(); 
} 

void lLC_LicenseNotValid() 
{ 
    //code when license is not valid 
} 
+0

Это будет проверять лицензию на звонки через каждые 10 секунд. Но я хочу проверить лицензию только тогда, когда это необходимо. Поэтому мне это не поможет. –

+0

Важно: «Как вы узнаете, что необходимо проверить лицензию? – Tatranskymedved

Смежные вопросы