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

C# 保持Windows服务在没有计时器的情况下运行,c#,windows,service,timer,C#,Windows,Service,Timer,目前,我在C#中看到的Windows服务的唯一示例是计时器每x秒通过一个方法运行一次,例如检查文件更改 我想知道是否有可能(如果可能的话,使用示例代码)让Windows服务在没有计时器的情况下运行,而只让服务监听事件——就像控制台应用程序仍然可以监听事件并避免在不需要计时器的情况下使用console.ReadLine()关闭一样 我正在寻找一种方法来避免事件发生和操作执行之间的x秒延迟。windows服务不需要创建计时器来保持运行。它可以建立文件监视程序,也可以启动异步套接字侦听器 这里是一个简

目前,我在C#中看到的Windows服务的唯一示例是计时器每x秒通过一个方法运行一次,例如检查文件更改

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


我正在寻找一种方法来避免事件发生和操作执行之间的x秒延迟。

windows服务不需要创建计时器来保持运行。它可以建立文件监视程序,也可以启动异步套接字侦听器

这里是一个简单的基于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();
    }
}
专用TcpListener\u侦听器;
public void OnStart(CommandLineParser commandLine)
{
_侦听器=新的TcpListener(IPAddress.Any、commandLine.Port);
_listener.Start();
Task.Run((Func)Listen);
}
专用异步任务侦听()
{
IMessageHandler=MessageHandler.Instance;
while(true)
{
var client=await\u listener.AcceptTcpClientAsync().ConfigureAwait(false);
//如果没有此处的等待,线程将自由运行
var task=ProcessMessage(客户端);
}
}
公共void OnStop()
{
_listener.Stop();
}
公共异步任务ProcessMessage(TcpClient客户端)
{
尝试
{
使用(var stream=client.GetStream())
{
var message=wait SimpleMessage.decodeAxync(流);
_handler.MessageReceived(message);
}
}
捕获(例外e)
{
_handler.MessageError(e);
}
最后
{
(客户端作为IDisposable.Dispose();
}
}

这两者都不需要计时器

您想要创建什么类型的服务有很多方法可以保持控制台打开和运行,而不需要使用while循环,例如,但是您应该提供有关您想要运行什么类型的服务的更多信息。。还有,你为什么要避免使用计时器呢?Windows服务与winforms应用程序没有太大区别。因此,如果它是一个控制台、winforms应用程序或windows服务,想法是一样的,这取决于您想要完成什么。在大多数情况下,当不涉及计时器时,开发WCF服务-@bokibeg
在大多数情况下,当不涉及计时器时,开发WCF服务
你一定是在开玩笑……@EZI我不是,如果他想“听事件”,我假设这些事件将来自另一个应用程序,在这种情况下,将使用名为pipes的应用程序,最好通过WCF完成。