Потоки и вызов метода в 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.. Нам нужно использовать другие.. Но какой это?