Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • SEARCH
  • Home
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 8342215
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: June 9, 20262026-06-09T05:42:16+00:00 2026-06-09T05:42:16+00:00

I am writing a WinForm application to use SNMP calls either every 30 seconds

  • 0

I am writing a WinForm application to use SNMP calls either every 30 seconds or 1 minute.

I have a timer working for calling my SNMP commands, but I want to add a texbox counter that display the total time elapsed during the operation.

There are many problems I am having so here is a list:

  1. I want my SNMP timer ‘timer’ to execute once before waiting the allotted time so I have it going off at 3 seconds and then changing the interval in my handler. But this sometimes makes the timer go off multiple times which is not what I want.
  2. Every time ‘timer’ goes off and my SNMP calls execute my counter timer ‘appTimer’ becomes out of sync. I tried a work around where I check if it is in the other handler and then just jump the timer to its appropriate time. Which works but I feel this is making it too complicated.
  3. My last issue, that I know of, happens when I stop my application using my stop button which does not completely exit the app. When I go to start another run the time between both timers is becomes even greater and for some reason my counting timer ‘appTimer’ starts counting twice as fast.

I hope this description isn’t too confusing but here is my code anyway:

using System;
using System.Net;
using SnmpSharpNet;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public static bool stop = false;
        static bool min = true, eye = false, firstTick = false;
        static string ipAdd = "", fileSaveLocation = "";
        static System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer();
        static System.Windows.Forms.Timer appTimer = new System.Windows.Forms.Timer();
        static int alarmCounter = 1, hours = 0, minutes = 0, seconds = 0, tenthseconds = 0, count = 0;
        static bool inSNMP = false;
        static TextBox textbox, timeTextbox;

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            textbox = outputBox;
            timeTextbox = timeBox;
            ipAdd = "192.168.98.107";
            fileSaveLocation = "c:/Users/bshellnut/Desktop/Eye.txt";
            min = true;
            inSNMP = false;
        }

        private void IPtext_TextChanged(object sender, EventArgs e)
        {
            ipAdd = IPtext.Text;
        }

        private void stopButton_Click(object sender, EventArgs e)
        {
            stop = true;
            timer.Stop();
            appTimer.Stop();
            count = 0;
            hours = minutes = seconds = tenthseconds = 0;
            inSNMP = false;
        }

        // This is the method to run when the timer is raised.
        private static void TimerEventProcessor(Object myObject,
                                                EventArgs myEventArgs)
        {
            inSNMP = true;
            timer.Stop();

            if (firstTick == true)
            {
                // Sets the timer interval to 60 seconds or 1 second.
                if (min == true)
                {
                    timer.Interval = 1000 * 60;
                }
                else
                {
                    timer.Interval = 1000 * 30;
                }
            }

            // Displays a message box asking whether to continue running the timer.
            if (stop == false)
            {
                textbox.Clear();
                // Restarts the timer and increments the counter.
                alarmCounter += 1;
                timer.Enabled = true;

                System.IO.StreamWriter file;
                //if (eye == true)
                //{
                    file = new System.IO.StreamWriter(fileSaveLocation, true);
                /*}
                else
                {
                    file = new System.IO.StreamWriter(fileSaveLocation, true);
                }*/

                // SNMP community name
                OctetString community = new OctetString("public");

                // Define agent parameters class
                AgentParameters param = new AgentParameters(community);
                // Set SNMP version to 2 (GET-BULK only works with SNMP ver 2 and 3)
                param.Version = SnmpVersion.Ver2;
                // Construct the agent address object
                // IpAddress class is easy to use here because
                //  it will try to resolve constructor parameter if it doesn't
                //  parse to an IP address
                IpAddress agent = new IpAddress(ipAdd);

                // Construct target
                UdpTarget target = new UdpTarget((IPAddress)agent, 161, 2000, 1);

                // Define Oid that is the root of the MIB
                //  tree you wish to retrieve
                Oid rootOid;
                if (eye == true)
                {
                    rootOid = new Oid("1.3.6.1.4.1.128.5.2.10.14"); // ifDescr
                }
                else
                {
                    rootOid = new Oid("1.3.6.1.4.1.128.5.2.10.15");
                }

                // This Oid represents last Oid returned by
                //  the SNMP agent
                Oid lastOid = (Oid)rootOid.Clone();

                // Pdu class used for all requests
                Pdu pdu = new Pdu(PduType.GetBulk);

                // In this example, set NonRepeaters value to 0
                pdu.NonRepeaters = 0;
                // MaxRepetitions tells the agent how many Oid/Value pairs to return
                // in the response.
                pdu.MaxRepetitions = 5;

                // Loop through results
                while (lastOid != null)
                {
                    // When Pdu class is first constructed, RequestId is set to 0
                    // and during encoding id will be set to the random value
                    // for subsequent requests, id will be set to a value that
                    // needs to be incremented to have unique request ids for each
                    // packet
                    if (pdu.RequestId != 0)
                    {
                        pdu.RequestId += 1;
                    }
                    // Clear Oids from the Pdu class.
                    pdu.VbList.Clear();
                    // Initialize request PDU with the last retrieved Oid
                    pdu.VbList.Add(lastOid);
                    // Make SNMP request
                    SnmpV2Packet result;
                    try
                    {
                        result = (SnmpV2Packet)target.Request(pdu, param);
                    }
                    catch (SnmpSharpNet.SnmpException)
                    { 
                        timer.Stop();
                        textbox.Text = "Could not connect to the IP Provided.";
                        break;
                    }
                    // You should catch exceptions in the Request if using in real application.

                    // If result is null then agent didn't reply or we couldn't parse the reply.
                    if (result != null)
                    {
                        // ErrorStatus other then 0 is an error returned by 
                        // the Agent - see SnmpConstants for error definitions
                        if (result.Pdu.ErrorStatus != 0)
                        {
                            // agent reported an error with the request
                            textbox.Text = "Error in SNMP reply. " + "Error " + result.Pdu.ErrorStatus + " index " + result.Pdu.ErrorIndex;

                            lastOid = null;
                            break;
                        }
                        else
                        {
                            // Walk through returned variable bindings
                            foreach (Vb v in result.Pdu.VbList)
                            {
                                // Check that retrieved Oid is "child" of the root OID
                                if (rootOid.IsRootOf(v.Oid))
                                {
                                    count++;
                                    textbox.Text += "#" + count + " " + v.Oid.ToString() + " " + SnmpConstants.GetTypeName(v.Value.Type) +
                                                   " " + v.Value.ToString() + Environment.NewLine;

                                    file.WriteLine("#" + count + ", " + v.Oid.ToString() + ", " + SnmpConstants.GetTypeName(v.Value.Type) +
                                                   ", " + v.Value.ToString(), true);
                                    if (v.Value.Type == SnmpConstants.SMI_ENDOFMIBVIEW)
                                        lastOid = null;
                                    else
                                        lastOid = v.Oid;
                                }
                                else
                                {
                                    // we have reached the end of the requested
                                    // MIB tree. Set lastOid to null and exit loop
                                    lastOid = null;
                                }
                            }
                        }
                    }
                    else
                    {
                        //Console.WriteLine("No response received from SNMP agent.");
                        textbox.Text = "No response received from SNMP agent.";
                        //outputBox.Text = "No response received from SNMP agent.";
                    }
                }
                target.Close();
                file.Close();
            }
            else
            {
                // Stops the timer.
                //exitFlag = true;
                count = 0;
            }
        }

        private static void ApplicationTimerEventProcessor(Object myObject,
                                                EventArgs myEventArgs)
        {

            tenthseconds += 1;

            if (tenthseconds == 10)
            {
                seconds += 1;
                tenthseconds = 0;
            }

            if (inSNMP && !firstTick)
            {
                if (min)
                {
                    seconds = 60;
                }
                else
                {
                    textbox.Text += "IN 30 SECONDS!!!";
                    if (seconds < 30)
                    {
                        seconds = 30;
                    }
                    else
                    {
                        seconds = 60;
                    }
                }
            }

            if(seconds == 60)
            {
                seconds = 0;
                minutes += 1;
            }

            if(minutes == 60)
            {
                minutes = 0;
                hours += 1;
            }

            timeTextbox.Text = (hours < 10 ? "00" + hours.ToString() : hours.ToString()) + ":" + 
                               (minutes < 10 ? "0" + minutes.ToString() : minutes.ToString()) + ":" +
                               (seconds < 10 ? "0" + seconds.ToString() : seconds.ToString()) + "." +
                               (tenthseconds < 10 ? "0" + tenthseconds.ToString() : tenthseconds.ToString());
            inSNMP = false;
            firstTick = false;
        }

        private void eyeButton_Click(object sender, EventArgs e)
        {
            outputBox.Text = "Connecting...";
            eye = true;
            stop = false;
            count = 0;
            hours = minutes = seconds = tenthseconds = 0;

            timer.Tick += new EventHandler(TimerEventProcessor);

            timer.Interval = 3000;
            firstTick = true;

            appTimer.Tick += new EventHandler(ApplicationTimerEventProcessor);

            appTimer.Interval = 100;

            appTimer.Start();
            timer.Start();
        }

        private void jitterButton_Click(object sender, EventArgs e)
        {
            outputBox.Text = "Connecting...";
            eye = false;
            stop = false;
            count = 0;
            hours = minutes = seconds = tenthseconds = 0;

            timer.Tick += new EventHandler(TimerEventProcessor);

            timer.Interval = 3000;
            firstTick = true;

            appTimer.Tick += new EventHandler(ApplicationTimerEventProcessor);

            appTimer.Interval = 100;

            appTimer.Start();
            timer.Start();
        }

        private void Seconds_CheckedChanged(object sender, EventArgs e)
        {
            min = false;
        }

        private void Minutes_CheckedChanged(object sender, EventArgs e)
        {
            min = true;
        }

        private void exitButton_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }

        private void savetextBox_TextChanged(object sender, EventArgs e)
        {
            fileSaveLocation = savetextBox.Text;
        }
    }
}
  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-06-09T05:42:17+00:00Added an answer on June 9, 2026 at 5:42 am

    This is very easy to do with a single timer. The timer has a 1/10th second resolution (or so) and can be used directly to update the elapsed time. You can then use relative elapsed time within that timer to fire off your SNMP transaction, and you can reschedule the next one dynamically.

    Here’s a simple example

    using System;
    using System.Drawing;
    using System.Windows.Forms;
    
    class Form1 : Form
    {
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }
    
        DateTime lastSnmpTime;
        TimeSpan snmpTime = TimeSpan.FromSeconds(30);
        DateTime startTime;
        TextBox elapsedTimeTextBox;
        Timer timer;
    
        public Form1()
        {
            timer = new Timer { Enabled = false, Interval = 10 };
            timer.Tick += new EventHandler(timer_Tick);
    
            elapsedTimeTextBox = new TextBox { Location = new Point(10, 10), ReadOnly = true };
            Controls.Add(elapsedTimeTextBox);
        }
    
        protected override void OnLoad(EventArgs e)
        {
            base.OnLoad(e);
    
            startTime = DateTime.Now;
            timer.Start();
        }
    
        void timer_Tick(object sender, EventArgs e)
        {
            // Update elapsed time
            elapsedTimeTextBox.Text = (DateTime.Now - startTime).ToString("g");
    
            // Send SNMP
            if (DateTime.Now - lastSnmpTime >= snmpTime)
            {
                lastSnmpTime = DateTime.Now;
    
                // Do SNMP
    
                // Adjust snmpTime as needed
            }
        }
    }
    

    Updated Q&A

    With this code the timer fires once at the beginning where after I
    press the stop button and call timer.Stop() and then press my start
    button the timer doesn’t fire until roughly 12 seconds later. Will
    resetting the DateTimes fix this?

    When the user presses the Start button, set lastSnmpTime = DateTime.MinValue. This causes the TimeSpan of (DateTime.Now – lastSnmpTime) to be over 2,000 years, so it will be greater than snmpTime and will fire immediately.

    Also my output time in the text box looks like this: 0:00:02.620262.
    Why is that? Is there a way to make it display only 0:00:02.62?

    When you subtract two DateTime values, the result is a TimeSpan value. I used a standard TimeSpan formatting string of "g". You can use a custom TimeSpan formatting string of @"d\:hh\:mm\:ss\.ff" to get days:hours:minutes:seconds.fraction (2 decimal places).

    Also will the timer go on and print out to the text box when it is run
    for over 9 hours? Because I plan to have this running for 24 hrs+

    If you use the custom format with ‘d’ to show the number of days, it will run for TimeSpan.MaxValue which is slightly more than 10,675,199 days, which is more than 29,000 years.

    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

I'm working on re-writing a WinForms application into Silverlight. One use case in the
C# 3.5 Winforms app. I have a timer that fires every 30 seconds on
I am working on a C# WinForms application in VC# 2008 Express, writing unit
On this winform application I am writing, I want to secure one menu item
We're writing a .NET winform application and I'm looking for options on one of
I'm writing a WinForms application and want to have an MVC-Type Design. Actually it's
I am creating a winform application where I use Nhibernate. In my app I
I am writing an application in .NET Winform. The data files produced are required
I have a bug. In WinForm .NET2.0 application my HeavyFunction can be called from
I'm writing an application that I will use to keep up with my monthly

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.