The way I would handle this is to use a thread, not a timer, and to establish a connection and maintain it until the application closes: don't open and close the connection, keep it open.
Probably, I would misuse a BackgroundWorker and it's ReportProgress event to transfer an enum value indicating the status.
public enum ResponseCode
{
None,
TerraceDoorSensor,
BeamDetector2,
BeamDetector1,
SmokeDetected,
LPGGasLeakDetected,
Unknown,
}
Create a class level bool called exitNow, and create the background worker:
BackgroundWorker work = new BackgroundWorker();
work.WorkerReportsProgress = true;
work.ProgressChanged += new ProgressChangedEventHandler(work_ProgressChanged);
work.DoWork += new DoWorkEventHandler(work_DoWork);
exitNow = false;
work.RunWorkerAsync();
The background worker sits in a loop:
void work_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker work = sender as BackgroundWorker;
if (work != null)
{
net = new Network("172.16.3.230");
net.InitConnection();
while (!exitNow)
{
net.send(st.create_read_packet());
int deviceResponse = net.receive()[9];
ResponseCode status = ResponseCode.None;
switch (deviceResponse)
{
default: status = ResponseCode.Unknown; break;
case 0x02: status = ResponseCode.TerraceDoorSensor; break;
case 0x80: status = ResponseCode.BeamDetector1; break;
...
}
work.ReportProgress((int) status);
System.Threading.Thread.Sleep(500);
}
...
}
}
And the report progress event does the display:
void work_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
ResponseCode status = (ResponseCode)e.ProgressPercentage;
switch (status)
{
case ResponseCode.None: break;
case ResponseCode.BeamDetector1: MessageBox.Show("Beam detector1 event"); break;
...
}
}
(Though I'd probably not use a MEssageBox!)
When you close your app, in your FormClosing event you set exitNow to true to allow the worker to die naturally.