我有一个非常奇怪的错误,我似乎无法弄清楚。我会尽我所能摆出来。
上下文:我有一个应用程序,它将持续ping一组位于不同位置的IP。 (我们需要查看每个设备是否在给定时间启动)
错误:当ping主机并且他们的互联网关闭时,应用程序会显示所有设备都已关闭(应该这样)。但是当关闭应用程序时,进程(主应用程序exe)仍在运行,我们的路由器流量显示连续ping仍在运行。(相同的间隔)。所以就像计时器一样。
但是当应用程序关闭,并且该组启动时,该过程将按原样关闭,所有ping停止。
我可以提供您想要查看的任何代码。我首先给出基础知识:
我有一个叫做EquipmentObj的班级。在构造函数内部,连续的ping启动(异步) *请注意,这一切都是在单独的表格上完成的,而不是主要形式。 构造函数和属性:
System.Timers.Timer TimerObj { get; set; }
public EquipmentObj(string ipAddress)
{
this.IP_Address = ipAddress;
this.TimerObj = new System.Timers.Timer();
this.TimerObj.Interval = 2000;
this.TimerObj.Elapsed += TimerObj_Elapsed;
this.TimerObj.AutoReset = true;
this.start();
}
开始和经过的方法:
private void start()
{
this._requestStop = false;
this.TimerObj.Start();
}
private void TimerObj_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
if(!_requestStop)
base.start_Ping(this.Ip_Address);
}
基类:
public void start_Ping(string ipAddress)
{
try
{
Ping pingSender = new Ping();
// Create the event Handler
pingSender.PingCompleted += pingSender_PingCompleted;
// Create the buffer
// Reference buff size: "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
byte[] packetData = Encoding.ASCII.GetBytes("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
// Create the pingOptions object
PingOptions packetOptions = new PingOptions();
// Parse the passed ip address to a proper ipaddress object
IPAddress ip = System.Net.IPAddress.Parse(ipAddress);
// Send async
pingSender.SendAsync(ip, 1050, packetData, ip);
}
catch (Exception ex)
{
Error_Log.write_log(ex);
}
}
public virtual void pingSender_PingCompleted(object sender, PingCompletedEventArgs e)
{
throw new NotImplementedException();
}
已实施Ping完成:
public override void pingSender_PingCompleted(object sender, PingCompletedEventArgs e)
{
if (e.Reply.Status == IPStatus.Success)
this.status = "On Line";
else
{
this.status = "Off Line";
this.setBounced = ++this.setBounced ?? 1;
}
this.setResponse = e.Reply.RoundtripTime.ToString();
}
最后我的清理工作在表格结束时调用:
foreach (EquipmentObj obj in this.objectListView1.Objects)
{
obj.Stop();
}
这是停止:
public void Stop()
{
this._requestStop = true;
this.TimerObj.Stop();
}
我尝试了什么:
这些都没有奏效。 我希望我没有过多的代码和写作。任何帮助,将不胜感激。
答案 0 :(得分:0)
我最好的选择是在调用Stop之前抛出异常。我会在那里添加一些try { } catch
语句,以便您可以处理错误。
在尝试访问未在同一线程上创建的对象时,可能会遇到一些线程问题。
我会在你弄乱计时器对象的时候检查你是否需要调用。
void Stop()
{
if (objectListView1.InvokeRequired)
{
objectListView1.BeginInvoke(new Action(Stop));
return;
}
foreach (EquipmentObj obj in this.objectListView1.Objects)
{
obj.Stop();
}
}