C#,在 Windows 服务启动中调用异步方法



>我正在开发一个能够接收套接字连接的Windows服务,因此在OnStart方法中:

protected override void OnStart(string[] args)
{
start();
}

start函数如下所示:

public async void Start()
{
//initialization things
...
...
TcpListener listener = new TcpListener(IPAddress.Any, port);
listener.Start();
while(true)
{
TcpClient client = await listener.AcceptTcpClientAsync().ConfigureAwait(false);
...
}
...    
}

问题是不接受任何连接,而相同的代码在标准命令行项目中运行完美,我怀疑我的设计中存在问题,哪个线程运行OnStart方法?,当控制在await接受过程后返回到OnStart时,异步方法是否被忽略,因为它是 Windows 服务中的特例?欢迎任何建议

调用 start() 方法时,代码会立即继续,OnStart 完成。现在,您自己的代码中没有任何部分能够捕获任何异常。异常必须由任务计划程序捕获。但这只会在等待任务或垃圾回收时发生。

所以基本上,你的代码可能会抛出一个Exception,直到Task被垃圾回收。为了更快地捕获日志异常,请始终确保在方法中捕获未在任何地方等待的异常:

protected override void OnStart(string[] args)
{
Start();
// This method finishes immediately (or at least after your first 
// 'await' in the Start() method. That does not mean Start() runs 
// on another thread however.
}
private async Task Start()
{
try
{
//initialization things
...
...
TcpListener listener = new TcpListener(IPAddress.Any, port);
listener.Start();
while(true)
{
TcpClient client = await listener.AcceptTcpClientAsync().ConfigureAwait(false);
...
}
...   
}
catch (Exception ex)
{
// TODO: LOG! And probably stop the service too.
} 
}

似乎这是Windows防火墙中的一个问题,当我将我的代码作为控制台应用程序进行测试时,我收到了来自Windows防火墙的确认消息,要求允许打开端口,但是当我将其作为服务进行测试时,防火墙静默地阻止了传入的连接,没有任何通知。

最新更新