Search code examples
c#windows-servicespolling

Polling using Windows Service


By going through some samples, I referred to Polling Service - C# for my polling.

This is my code.

public partial class Service1 : ServiceBase
{
    private readonly PollingService _pollingService = new PollingService();

    public Service1()
    {
        InitializeComponent();
    }

    protected override void OnStart(string[] args)
    {
        _pollingService.StartPolling();
    }

    protected override void OnStop()
    {
       _pollingService.StopPolling();
    }
}

public class PollingService
{
    private Thread _workerThread;
    private AutoResetEvent _finished;
    private const int _timeout = 60 * 1000;
    string command = "5120000000000000000000000000000";


    public void StartPolling()
    {
        _workerThread = new Thread(Poll);
        _finished = new AutoResetEvent(false);
        _workerThread.Start();
    }

    private void Poll()
    {
        while (!_finished.WaitOne(_timeout))
        {
            //do the task
            using (TcpClient newclient = new TcpClient())
            {
                IAsyncResult ar = newclient.BeginConnect("192.168.0.151", 4000, null, null);
                if (!ar.AsyncWaitHandle.WaitOne(TimeSpan.FromSeconds(2), false))
                {
                    return;
                }

                NetworkStream ns = newclient.GetStream();
                byte[] outbytes = HexStringToByteArray(command);
                ns.Write(outbytes, 0, outbytes.Length);
            }
        }
    }

    public void StopPolling()
    {
        _finished.Set();
        _workerThread.Join();
    }

    public static byte[] HexStringToByteArray(string hexString)
    {
        if (hexString.Length % 2 > 0)
        {
            throw new Exception("Invalid command.");
        }
        byte[] result = new byte[hexString.Length / 2];
        try
        {
            for (int i = 0; i < result.Length; i++)
            {
                result[i] = Convert.ToByte(hexString.Substring(2 * i, 2), 16);
            }
        }
        catch (Exception)
        {
            throw;
        }
        return result;
    }
}

I've managed to install. However, when I'm trying to start the service, I'm getting Windows could not start the service on Local Computer. Error 5: Access is denied. I've tried using the solutions given here, Error 5 : Access Denied when starting windows service, however, it is not working.


Solution

  • I found the solution by changing the service properties from This Account to Local System Account with some updated codes.

     using (TcpClient newclient = new TcpClient("192.168.0.151", 4000))
     {
         NetworkStream ns = newclient.GetStream();
         byte[] outbytes = Encoding.ASCII.GetBytes(command);
         ns.Write(outbytes, 0, outbytes.Length);
         ns.Close();
         newclient.Close();
     }