保持Windows服务在没有计时器的情况下运行

时间:2015-03-11 21:22:18

标签: c# windows service timer

目前,我所见过的C#中Windows服务的唯一例子是计时器每隔x秒运行一次方法 - 例如检查文件更改。

我想知道是否有可能(如果可能的话,使用示例代码)保持Windows服务在没有计时器的情况下运行,而只是让服务监听事件 - 就像控制台应用程序仍然可以监听事件并避免使用Console.ReadLine()关闭而无需计时器。

我基本上正在寻找一种方法来避免事件发生和正在执行的操作之间的第二次延迟。

1 个答案:

答案 0 :(得分:7)

Windows服务不需要创建计时器来继续运行。它可以建立文件监视器Using FileSystemWatcher to monitor a directory或启动异步套接字监听器。

这是一个简单的基于TPL的监听器/响应器,无需将线程专用于该进程。

private TcpListener _listener;

public void OnStart(CommandLineParser commandLine)
{
    _listener = new TcpListener(IPAddress.Any, commandLine.Port);
    _listener.Start();
    Task.Run((Func<Task>) Listen);
}

private async Task Listen()
{
    IMessageHandler handler = MessageHandler.Instance;

    while (true)
    {
        var client = await _listener.AcceptTcpClientAsync().ConfigureAwait(false);

        // Without the await here, the thread will run free
        var task = ProcessMessage(client);
    }
}

public void OnStop()
{
    _listener.Stop();
}

public async Task ProcessMessage(TcpClient client)
{
    try
    {
        using (var stream = client.GetStream())
        {
            var message = await SimpleMessage.DecodeAsync(stream);
            _handler.MessageReceived(message);
        }
    }
    catch (Exception e)
    {
        _handler.MessageError(e);
    }
    finally
    {
        (client as IDisposable).Dispose();
    }
}

这些都不需要计时器