ограничить выполнение задачи один раз при выполнении условий

#c#

#c#

Вопрос:

У меня есть задание по расписанию, которое мне нужно запустить, когда VPN-соединение вернет значение True. мой код ниже schedtask выполняется как минимум дважды. есть идеи о том, как ограничить выполнение этой задачи только один раз?

  public void AddressChangedCallback(object sender, EventArgs e)
    {
        CheckForVPNInterface();     
    }
    public bool CheckForVPNInterface()
        {
            if (NetworkInterface.GetIsNetworkAvailable())
            {
                NetworkInterface[] interfaces =  NetworkInterface.GetAllNetworkInterfaces();
                foreach (NetworkInterface Interface in interfaces)
                { 
                    if ((Interface.Description.Contains("Cisco")) amp;amp; (Interface.OperationalStatus == OperationalStatus.Up))
                    {
                    Thread.Sleep(1000);
                    schedTask();
                    
                    return true;
                }
              }    
        }
            return false;
        }
 

Комментарии:

1. Проверьте, вызывается ли функция AddressChangedCallback более одного раза.

Ответ №1:

Я предполагаю, что ваша проблема заключается в том, что существует более одного интерфейса, который удовлетворяет этим требованиям

 if (!NetworkInterface.GetIsNetworkAvailable()) return false;

var runTask = NetworkInterface
   .GetAllNetworkInterfaces()
   .Any(x => x.Description.Contains("Cisco") 
             amp;amp; x.OperationalStatus == OperationalStatus.Up);

if (runTask)
   schedTask();

return runTask;
 

Если ваша проблема заключается в том, что событие может запускаться более одного раза. Потокобезопасным способом может быть использование Interlocked.Increment

Увеличивает указанную переменную и сохраняет результат как атомарную операцию

 public static int runCount = 0;

...


if (!NetworkInterface.GetIsNetworkAvailable() ) return false;

var runTask = NetworkInterface
   .GetAllNetworkInterfaces()
   .Any(x => x.Description.Contains("Cisco") 
             amp;amp; x.OperationalStatus == OperationalStatus.Up);

if (runTask amp;amp; Interlocked.Increment(ref runCount) == 1)
{
   schedTask();
   return true;
}
 

Комментарии:

1. спасибо за это, но заблокированная переменная предотвратит обратный вызов AddressChangedCallback . событие было вызвано снова, если пользователь решил повторно подключиться к VPN

2. фактическая блокировка сработала после сброса количества выполнения.