C#,在Windows服务的OnStart中调用异步方法

amm*_*com 3 c# asynchronous windows-services async-await

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

protected override void OnStart(string[] args)
{
    start();
}
Run Code Online (Sandbox Code Playgroud)

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);
          ...
      }
      ...    
}
Run Code Online (Sandbox Code Playgroud)

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

Jes*_*Wit 7

当调用 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.
    } 
}
Run Code Online (Sandbox Code Playgroud)