#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. фактическая блокировка сработала после сброса количества выполнения.