在 ASP.NET Core 中处理 BackgroundService 中的非托管回调

Handle unmanaged callback in BackgroundService in ASP.NET Core

我正在尝试构建一个 ASP.NET 核心应用程序,它应该接收非托管代码中的信息并将该信息呈现给网络用户。当 ASP.NET 核心应用程序启动时,它将启动一个后台服务,该服务将在非托管代码中注册一个回调。

在Main函数中我注册了后台服务启动:

 public class Program
{
    public static void Main(string[] args)
    {
        CreateHostBuilder(args).Build().Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            }).ConfigureServices(services =>
            {
                services.AddHostedService<ReadService>();
            })
        ;
}

然后在我的后台服务中,我在非托管代码中注册回调:

public class ReadService: BackgroundService
{
    [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
    public delegate void CSCALLBACK([In, MarshalAs(UnmanagedType.LPStr)] string a);

    [DllImport("managed_service_wrapper", CallingConvention = CallingConvention.Cdecl)]
    public static extern int SetCallback(CSCALLBACK callback);

    public ReadService()
    {
        CSCALLBACK cb = OnNewUpdates;
        var a = SetCallback(cb);
    }
    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        while (!stoppingToken.IsCancellationRequested)
        {
            //something
        }
    }

    static void OnNewUpdates(string a)
    {
        //something
    }

}

调用 SetCallback 函数时,非托管代码将开始侦听更新,但 return 将在开始侦听时启动。

这还能用吗?当触发回调时,它会阻塞其余代码吗?我应该在 OnNewUpdates 中使用什么来向 ExecuteAsync 发出有新更新的信号?

更新2020-11-02 也许我的问题不是很清楚所以说得更清楚:

在进一步调查之后,我意识到就像@poke 说拥有 BackgroundService 是错误的,它只需要是一个“正常”服务即可。