C# .net核心后台服务Http服务器/GRPC-停止方法?

C# .net核心后台服务Http服务器/GRPC-停止方法?,c#,.net,.net-core,C#,.net,.net Core,目前,在.net coreBackgroundService中实际运行Http服务器的最佳方式是什么,即运行很容易,但如何真正正确地集成停止方法 目前我编写的代码如下: var server = new Server { Services = {ConnectionHandler.BindService(_vpnConnectionHandler)}, Ports = {new ServerPort("0.0.0.0", 50055, ServerCredentials.Inse

目前,在.net core
BackgroundService
中实际运行Http服务器的最佳方式是什么,即运行很容易,但如何真正正确地集成停止方法

目前我编写的代码如下:

var server = new Server
{
    Services = {ConnectionHandler.BindService(_vpnConnectionHandler)},
    Ports = {new ServerPort("0.0.0.0", 50055, ServerCredentials.Insecure)}
};

var source = new TaskCompletionSource<bool>();
stoppingToken.Register(async () => await server.ShutdownAsync());

server.Start();

if (!stoppingToken.IsCancellationRequested)
{
    await source.Task;
}
但是表演真的很糟糕

这真的是正确的做法吗?
还是有更好的方法?(
iaapplicationlifetime

BackgroundService
实现
IHostedService
。您可以实现自己的微型后台服务,它还实现了
IHostedService

public class YourBackgroundService : IHostedService
{
    private Server _server;

    public Task StartAsync(CancellationToken cancellationToken)
    {
        _server = new Server
        {
            Services = {ConnectionHandler.BindService(_vpnConnectionHandler)},
            Ports = {new ServerPort("0.0.0.0", 50055, ServerCredentials.Insecure)}
        };

        _server.Start();

        return Task.CompletedTask;
    }

    public Task StopAsync(CancellationToken cancellationToken)
    {
        return server?.ShutdownAsync() ?? Task.CompletedTask;
    }
}
public class YourBackgroundService : IHostedService
{
    private Server _server;

    public Task StartAsync(CancellationToken cancellationToken)
    {
        _server = new Server
        {
            Services = {ConnectionHandler.BindService(_vpnConnectionHandler)},
            Ports = {new ServerPort("0.0.0.0", 50055, ServerCredentials.Insecure)}
        };

        _server.Start();

        return Task.CompletedTask;
    }

    public Task StopAsync(CancellationToken cancellationToken)
    {
        return server?.ShutdownAsync() ?? Task.CompletedTask;
    }
}