Потоки и вызов метода в Windows Service

Я реализую этот проект как Windows Service. Я пытаюсь найти открытые сетевые интерфейсы в локальной сети и войти в них. Когда происходит изменение в сетевых интерфейсах, запускается новый метод adapterNotifier

    public void newAdapterNotifier(object sender, EventArrivedEventArgs e) //Change in network
    {
        checkNetworkAdapters();
    }

Этот метод запускается WMI.

ManagementEventWatcher watcher = null;
query = new WqlEventQuery();
query.EventClassName = "__InstanceOperationEvent";
query.WithinInterval = new TimeSpan(0, 0, 1);
query.Condition = @"TargetInstance ISA 'Win32_NetworkAdapter' AND TargetInstance.NetConnectionStatus IS NOT NULL";
watcher = new ManagementEventWatcher(scope, query);
watcher.EventArrived += new EventArrivedEventHandler(newAdapterNotifier);

В newAdapterNotifier я вызываю checkNetworkAdapters, он не дает никакой ошибки, но тоже не работает. В WindowsForms я делаю один и тот же код с той лишь разницей, и он РАБОТАЕТ!!!

public delegate void ControlNetworkAdapter();
public void newAdapterNotifier(object sender, EventArrivedEventArgs e) //Change in network
{
    this.Invoke(new ControlNetworkAdapter(checkNetworkAdapters));
}

Поскольку в приложении Windows Service нет метода Invoke, он не работает. Как я могу решить это?

ПОЛНЫЙ КОД КЛАССА (Если есть какой-либо другой сетевой интерфейс, открытый, в то время как разрешено открыто. Отправить почту)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Management;
using System.Net.NetworkInformation;

namespace newInternetNotifier
{
    class newNetworkInterfaceNotifier
    {
        ManagementEventWatcher watcher = null;
        WqlEventQuery query;
        ManagementOperationObserver observer = new ManagementOperationObserver();
        ManagementScope scope = new ManagementScope("root\\CIMV2");
        DbManager sqlConn;
        string cameras1IP = "10.0.0.102";
        string cameras2IP = "10.0.0.103";

        public newNetworkInterfaceNotifier(DbManager _sqlConn)
        {
            sqlConn = _sqlConn;
            getPingableIPs();
            System.Threading.Thread thr = System.Threading.Thread.CurrentThread;
            tmr.Tick +=new EventHandler(tmr_Tick);

            stopTimer();

            checkNetworkAdapters();
            prepareEvent();
        }

        void getPingableIPs() {
            cameras1IP = sqlConn.GetScalarValue("SELECT dbo.GetIP(1)").ToString();
            cameras2IP = sqlConn.GetScalarValue("SELECT dbo.GetIP(2)").ToString();
        }

        int elapsedTime;
        System.Windows.Forms.Timer tmr = new System.Windows.Forms.Timer();
        void startTimer() 
        {
            elapsedTime = 0;
            tmr.Interval = 1000;
            tmr.Start();
        }

        void stopTimer()
        {
            tmr.Stop();
        }

        void tmr_Tick(object sender, EventArgs e)
        {
            elapsedTime += 1;
            if (elapsedTime == 10) {
                stopTimer();
                MailSend();
            }
        }

        public void MailSend() {
            //Send mail code here
        }

        bool sendMail = false;
        protected bool SendMail
        {
            set 
            {
                if (value && !sendMail)
                    startTimer();
                else if (!value && sendMail)
                    stopTimer();

                sendMail = value; 
            }
            get { return sendMail; }
        }

        public void prepareEvent()
        {
            scope.Options.EnablePrivileges = true;
            try
            {
                query = new WqlEventQuery();
                query.EventClassName = "__InstanceOperationEvent";
                query.WithinInterval = new TimeSpan(0, 0, 1);
                query.Condition = @"TargetInstance ISA 'Win32_NetworkAdapter' AND TargetInstance.NetConnectionStatus IS NOT NULL";
                watcher = new ManagementEventWatcher(scope, query);
                watcher.EventArrived += new EventArrivedEventHandler(newAdapterNotifier);
                watcher.Start();                   
            }
            catch
            {
                System.Threading.Thread.Sleep(100000);
                prepareEvent();
            }
        }

        public void watcherStop()
        {
            watcher.Stop();
        }

        Ping p = new Ping();
        public HashSet<NetworkInterface> upAndReal;
        public void checkNetworkAdapters()
        {
            if (upAndReal == null)
                upAndReal = new HashSet<NetworkInterface>();
            else if (upAndReal.Count > 0)
                upAndReal.Clear();

            string desc = "";
            string name = "";

            foreach (NetworkInterface netInt in NetworkInterface.GetAllNetworkInterfaces())
            {
                desc = netInt.Description;
                name = netInt.Name;

                if (netInt.OperationalStatus == OperationalStatus.Up && desc.IndexOf("virtual", StringComparison.OrdinalIgnoreCase) < 0 && name.IndexOf("virtual", StringComparison.OrdinalIgnoreCase) < 0 && desc.IndexOf("Microsoft", StringComparison.OrdinalIgnoreCase) < 0 && name.IndexOf("Microsoft", StringComparison.OrdinalIgnoreCase) < 0 && (desc.IndexOf("Loopback", StringComparison.OrdinalIgnoreCase) < 0) && name.IndexOf("Loopback", StringComparison.OrdinalIgnoreCase) < 0)
                {
                    upAndReal.Add(netInt);
                }
            }

            if (upAndReal.Count <= 1 || (upAndReal.Count == 2 && p.Send(cameras1IP).Status == IPStatus.Success && p.Send(cameras2IP).Status == IPStatus.Success)){
                SendMail = false;
                return;
            }

            SendMail = true;
        }

        public void newAdapterNotifier(object sender, EventArrivedEventArgs e) //Change in network
        {

            checkNetworkAdapters();
        }
    }
}

1 ответ

Я решил проблему. Это о Таймере. Мы не можем использовать System.Windows.Forms.Timer в Windows Service.. Нам нужно использовать другие.. Но какой это?

Другие вопросы по тегам