繁体   English   中英

使用Windows服务进行轮询

[英]Polling using Windows Service

通过查看一些示例,我参考了Polling Service-C#进行轮询。

这是我的代码。

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;
    }
}

我已经成功安装了。 但是,当我尝试启动该服务时,我发现Windows could not start the service on Local Computer. Error 5: Access is denied Windows could not start the service on Local Computer. Error 5: Access is denied 我尝试使用此处提供的解决方案, 错误5:启动Windows Service时访问被拒绝 ,但是,它不起作用。

通过使用一些更新的代码将服务属性从“ This Account更改为“ Local System Account ,我找到了解决方案。

 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();
 }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM